diff --git a/ASCOfficeDocxFile2/BinReader/Readers.cpp b/ASCOfficeDocxFile2/BinReader/Readers.cpp index 15a7da8b63..d391705b3d 100644 --- a/ASCOfficeDocxFile2/BinReader/Readers.cpp +++ b/ASCOfficeDocxFile2/BinReader/Readers.cpp @@ -9425,7 +9425,8 @@ int Binary_DocumentTableReader::ReadSdtPicture(BYTE type, long length, void* poR int Binary_DocumentTableReader::ReadSdtFormPr(BYTE type, long length, void* poResult) { int res = 0; - ComplexTypes::Word::CFormPr* pFormPr = static_cast(poResult); + OOX::Logic::CFormPr* pFormPr = static_cast(poResult); + if (c_oSerSdt::FormPrKey == type) { pFormPr->m_oKey = m_oBufferedStream.GetString3(length); @@ -9442,6 +9443,16 @@ int Binary_DocumentTableReader::ReadSdtFormPr(BYTE type, long length, void* poRe { pFormPr->m_oRequired = m_oBufferedStream.GetBool(); } + else if (c_oSerSdt::FormPrBorder == type) + { + pFormPr->m_oBorder.Init(); + READ2_DEF(length, res, oBinary_pPrReader.ReadBorder2, pFormPr->m_oBorder.GetPointer()); + } + else if (c_oSerSdt::FormPrShd == type) + { + pFormPr->m_oShd.Init(); + READ2_DEF(length, res, oBinary_CommonReader2.ReadShd, pFormPr->m_oShd.GetPointer()); + } else res = c_oSerConstants::ReadUnknown; return res; diff --git a/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h b/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h index 267407744e..379fa51f3a 100644 --- a/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h +++ b/ASCOfficeDocxFile2/BinWriter/BinReaderWriterDefines.h @@ -110,7 +110,7 @@ const double g_dKoef_mm_to_hps = 2 * g_dKoef_mm_to_pt; const static wchar_t* g_sFormatSignature = L"DOCY"; const int g_nFormatVersion = 5; -const int g_nFormatVersionNoBase64 = 10; +const int g_nFormatVersionNoBase64 = 10; extern int g_nCurFormatVersion; namespace c_oAscWrapStyle{enum c_oSerFormat { @@ -1244,7 +1244,9 @@ extern int g_nCurFormatVersion; PictureFormPrLockProportions = 62, PictureFormPrRespectBorders = 63, PictureFormPrShiftX = 64, - PictureFormPrShiftY = 65 + PictureFormPrShiftY = 65, + FormPrBorder = 70, + FormPrShd = 71 };} namespace c_oSerFFData{enum c_oSerFFData { diff --git a/ASCOfficeDocxFile2/BinWriter/BinWriters.cpp b/ASCOfficeDocxFile2/BinWriter/BinWriters.cpp index ba8c3e93ca..90c09b0fdc 100644 --- a/ASCOfficeDocxFile2/BinWriter/BinWriters.cpp +++ b/ASCOfficeDocxFile2/BinWriter/BinWriters.cpp @@ -7846,7 +7846,7 @@ void BinaryDocumentTableWriter::WriteDropDownList(const OOX::Logic::CSdtDropDown m_oBcw.WriteItemEnd(nCurPos); } } -void BinaryDocumentTableWriter::WriteSdtFormPr(const ComplexTypes::Word::CFormPr& oFormPr) +void BinaryDocumentTableWriter::WriteSdtFormPr(const OOX::Logic::CFormPr& oFormPr) { int nCurPos = 0; if(oFormPr.m_oKey.IsInit()) @@ -7873,6 +7873,18 @@ void BinaryDocumentTableWriter::WriteSdtFormPr(const ComplexTypes::Word::CFormPr m_oBcw.m_oStream.WriteBOOL(oFormPr.m_oRequired.get()); m_oBcw.WriteItemEnd(nCurPos); } + if (oFormPr.m_oBorder.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::TextFormPrCombBorder); + m_oBcw.WriteBorder(oFormPr.m_oBorder.get()); + m_oBcw.WriteItemEnd(nCurPos); + } + if (oFormPr.m_oShd.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::TextFormPrCombBorder); + m_oBcw.WriteShd(oFormPr.m_oShd.get()); + m_oBcw.WriteItemEnd(nCurPos); + } } void BinaryDocumentTableWriter::WriteSdtTextFormPr(const OOX::Logic::CTextFormPr& oTextFormPr) { diff --git a/ASCOfficeDocxFile2/BinWriter/BinWriters.h b/ASCOfficeDocxFile2/BinWriter/BinWriters.h index d345ccd484..82718dc618 100644 --- a/ASCOfficeDocxFile2/BinWriter/BinWriters.h +++ b/ASCOfficeDocxFile2/BinWriter/BinWriters.h @@ -498,7 +498,7 @@ namespace BinDocxRW void WriteSdtPrDate(const OOX::Logic::CDate& oDate); void WriteDocPartList(const OOX::Logic::CSdtDocPart& oSdtDocPart); void WriteDropDownList(const OOX::Logic::CSdtDropDownList& oDropDownList); - void WriteSdtFormPr(const ComplexTypes::Word::CFormPr& oFormPr); + void WriteSdtFormPr(const OOX::Logic::CFormPr& oFormPr); void WriteSdtTextFormPr(const OOX::Logic::CTextFormPr& oTextFormPr); void WriteSdtTextFormPrComb(const ComplexTypes::Word::CComb& oComb); void WriteSdtPicture(const OOX::Logic::CSdtPicture& oSdtPicture); diff --git a/ASCOfficeDocxFile2/DocWrapper/DocxSerializer.cpp b/ASCOfficeDocxFile2/DocWrapper/DocxSerializer.cpp index 2d5540620d..294e246895 100644 --- a/ASCOfficeDocxFile2/DocWrapper/DocxSerializer.cpp +++ b/ASCOfficeDocxFile2/DocWrapper/DocxSerializer.cpp @@ -122,6 +122,9 @@ namespace BinDocxRW if (L"pkg:xmlData" == sName) { std::wstring data = oReader.GetInnerXml(); + XmlUtils::replace_all(data, L" ", L""); + XmlUtils::replace_all(data, L" ", L""); + //todooo убрать "красивую" разметку xml WriteXmlFile(*name, data); } if (L"pkg:binaryData" == sName) @@ -142,6 +145,7 @@ namespace BinDocxRW NSFile::CFileBinary file; if (file.CreateFileW(path.GetPath())) { + file.WriteStringUTF8(L"\r\n"); file.WriteStringUTF8(data); file.CloseFile(); } diff --git a/ASCOfficeOdfFile/src/docx/docx_conversion_context.cpp b/ASCOfficeOdfFile/src/docx/docx_conversion_context.cpp index 8eb4562902..4abc361a27 100644 --- a/ASCOfficeOdfFile/src/docx/docx_conversion_context.cpp +++ b/ASCOfficeOdfFile/src/docx/docx_conversion_context.cpp @@ -1119,6 +1119,8 @@ void docx_conversion_context::process_styles() } _Wostream << L""; + std::wstring default_style; + for (size_t i = 0; i < arStyles.size(); i++) { if (false == arStyles[i]->is_automatic() && @@ -1134,6 +1136,11 @@ void docx_conversion_context::process_styles() if (bDefault) // style { _Wostream << L" w:default=\"1\""; + + if (arStyles[i]->type() == odf_types::style_family::Paragraph) + { + default_style = id; + } } else if (!arStyles[i]->is_default()) // default-style { @@ -1150,6 +1157,10 @@ void docx_conversion_context::process_styles() const std::wstring basedOnId = styles_map_.get(baseOn->name(), baseOn->type()); _Wostream << L""; } + else if (!bDefault && !default_style.empty()) + { + _Wostream << L""; + } // else if (false == bDefault && false == arStyles[i]->is_default() && styles_map_.check(L"", arStyles[i]->type())) // { //bDisplayed = false; @@ -1809,7 +1820,7 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_ //process_paragraph_style(Context.get_current_paragraph_style()); ?? //if ((Attr->outline_level_) && (*Attr->outline_level_ > 0)) - if (outline_level) + if ((outline_level) && (*outline_level < 10)) { output_stream() << L""; output_stream() << L""; @@ -1821,7 +1832,7 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_ output_stream() << get_section_context().dump_; get_section_context().dump_.clear(); //if ((Attr->outline_level_) && (*Attr->outline_level_ > 0)) - if (outline_level) + if ((outline_level) && (*outline_level < 10)) { output_stream() << L""; } diff --git a/ASCOfficeOdfFile/src/docx/xlsx_conditionalFormatting.cpp b/ASCOfficeOdfFile/src/docx/xlsx_conditionalFormatting.cpp index 74e4b46930..d0fa542d42 100644 --- a/ASCOfficeOdfFile/src/docx/xlsx_conditionalFormatting.cpp +++ b/ASCOfficeOdfFile/src/docx/xlsx_conditionalFormatting.cpp @@ -89,6 +89,7 @@ namespace oox { _CP_OPT(std::wstring) text; _CP_OPT(std::wstring) formula2; _CP_OPT(int) rank; + _CP_OPT(bool) bottom; //color scale icon set data_bar std::vector<_cfvo> cfvo; //color scale data_bar(1 element) @@ -144,9 +145,8 @@ public: if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue); if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); - - //CP_XML_ATTR(L"bottom" , 0); - //CP_XML_ATTR(L"equalAverage" , 0); + if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); + //CP_XML_ATTR(L"equalAverage" , 0); //CP_XML_ATTR(L"aboveAverage" , 0); if (c.rules[j].type == 1) { @@ -362,6 +362,21 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) impl_->conditionalFormattings_.back().rules.back().rank = boost::lexical_cast(val); } } + else if (0 <= (pos = f.find(L"bottom"))) + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"top10"; + impl_->conditionalFormattings_.back().rules.back().bottom = true; + if (0 < (pos = f.find(L"percent"))) + { + impl_->conditionalFormattings_.back().rules.back().percent = true; + } + if (0 <= (pos = f.find(L"("))) + { + val = f.substr(pos + 1, f.length() - pos - 2); + if (!val.empty()) + impl_->conditionalFormattings_.back().rules.back().rank = boost::lexical_cast(val); + } + } else { impl_->conditionalFormattings_.back().rules.back().formula_type = L"cellIs"; diff --git a/ASCOfficeOdfFile/src/docx/xlsxconversioncontext.cpp b/ASCOfficeOdfFile/src/docx/xlsxconversioncontext.cpp index 828ab0180e..7b9e45eeaf 100644 --- a/ASCOfficeOdfFile/src/docx/xlsxconversioncontext.cpp +++ b/ASCOfficeOdfFile/src/docx/xlsxconversioncontext.cpp @@ -139,6 +139,13 @@ void xlsx_conversion_context::end_document() { std::wstringstream workbook_content; + if (sheets_.empty()) + { // owncloud new document ... oO + start_table(L"Sheet1", L""); + current_sheet().cols() << L""; + end_table(); + } + for (size_t i = 0; i < sheets_.size(); i++) { xlsx_xml_worksheet_ptr& sheet = sheets_[i]; diff --git a/ASCOfficeOdfFile/src/odf/odf_document_impl.cpp b/ASCOfficeOdfFile/src/odf/odf_document_impl.cpp index 1ec3f9fc00..12245558cc 100644 --- a/ASCOfficeOdfFile/src/odf/odf_document_impl.cpp +++ b/ASCOfficeOdfFile/src/odf/odf_document_impl.cpp @@ -518,26 +518,19 @@ void odf_document::Impl::parse_fonts(office_element *element) std::wstring altName = fontNames.size() >= 2 ? fontNames[1] : L""; const std::wstring charset = fontFace->style_font_charset_.get_value_or(L"") == L"x-symbol" ? L"02" : L"00"; - const std::wstring fontFamily + + std::wstring fontFamily = fontFace->style_font_family_generic_.get_value_or( font_family_generic(font_family_generic::System) ).get_type() == font_family_generic::System ? L"auto" : boost::lexical_cast(*fontFace->style_font_family_generic_); - const std::wstring fontPitch = fontFace->style_font_pitch_ ? boost::lexical_cast(*fontFace->style_font_pitch_) : L""; + + const std::wstring fontPitch = fontFace->style_font_pitch_ ? boost::lexical_cast(*fontFace->style_font_pitch_) : L""; boost::algorithm::trim_if(fontName, boost::algorithm::is_any_of("'")); - + font_instance_ptr fontInstance( new font_instance (styleName, fontName, charset, fontFamily, fontPitch, altName) ); context_->fontContainer().add_font( fontInstance ); - /*if (!context_.fontContainer().font_by_name(fontStyleName)) - { - // два раза не добавляем? - - } - else - { - _CP_LOG << L"[warning] duplicate font name (" << fontName << L")\n"; - }*/ } } while (0); @@ -854,7 +847,7 @@ void odf_document::Impl::parse_styles(office_element *element) L"", L"", L"", - L""); + L"default"); } for (size_t i = 0; i < docStyles->style_presentation_page_layout_.size(); i++) { diff --git a/ASCOfficeOdfFile/src/odf/style_paragraph_properties_docx.cpp b/ASCOfficeOdfFile/src/odf/style_paragraph_properties_docx.cpp index 5cff1ea5f7..e353ba5520 100644 --- a/ASCOfficeOdfFile/src/odf/style_paragraph_properties_docx.cpp +++ b/ASCOfficeOdfFile/src/odf/style_paragraph_properties_docx.cpp @@ -171,7 +171,7 @@ void paragraph_format_properties::docx_convert(oox::docx_conversion_context & Co if (style_inst) { if (level < 0 && style_inst->outline_level()) - { + { level = style_inst->outline_level().get(); } @@ -181,14 +181,31 @@ void paragraph_format_properties::docx_convert(oox::docx_conversion_context & Co } } - if (level >= 0) + if (level >= 0 && level < 10) { - if (list_styles.outline_style()) + text_outline_style* outline_style = list_styles.outline_style(); + if (outline_style) { - _pPr << L""; - if (level < 9 && bOutlineList) + bool bListEnabled = true; + if (level < outline_style->content_.size()) + { + office_element_ptr elm = outline_style->content_[level]; + text_outline_level_style* outline_level = dynamic_cast(elm.get()); + if (outline_level) { - _pPr << L""; + if (!outline_level->common_num_format_attlist_.style_num_format_) + bListEnabled = false; + else if (outline_level->common_num_format_attlist_.style_num_format_->get_type() == odf_types::style_numformat::none) + bListEnabled = false; + } + } + else + bListEnabled = false; + + _pPr << L""; + if (bListEnabled && level < 9 && bOutlineList) + { + _pPr << L""; _pPr << L""; } else diff --git a/ASCOfficeOdfFile/src/odf/style_text_properties.cpp b/ASCOfficeOdfFile/src/odf/style_text_properties.cpp index 08a8de36ae..4985badc3c 100644 --- a/ASCOfficeOdfFile/src/odf/style_text_properties.cpp +++ b/ASCOfficeOdfFile/src/odf/style_text_properties.cpp @@ -1407,8 +1407,16 @@ void text_format_properties_content::docx_convert(oox::docx_conversion_context & if (style_font_name_) { font_instance * font = fonts.font_by_style_name(*style_font_name_); - if (font) + if (font) + { w_ascii = w_hAnsi = font->name(); + + if (font->charset() == L"02") + { + if (w_cs.empty()) w_cs = font->name(); + if (w_eastAsia.empty()) w_eastAsia = font->name(); + } + } } _rPr << L"get_text_list_tab_stop_position() ? labelAlignment->get_text_list_tab_stop_position()->get_value_unit(length::pt) : 0; + double position = labelAlignment->text_list_tab_stop_position_ ? labelAlignment->text_list_tab_stop_position_->get_value_unit(length::pt) : 0; CP_XML_WRITER(strm) { - if (position >0) + if (position > 0 && bTabs) { CP_XML_NODE(L"w:tabs") { @@ -293,8 +293,8 @@ void docx_serialize_label_alignment_props(std::wostream & strm, style_list_level } } } - int w_hanging = (int)( 0.5 - 20.0 * labelAlignment->get_fo_text_indent().get_value_or( length(0, length::pt) ).get_value_unit(length::pt) ); - int w_left = (int)( 0.5 + 20.0 * labelAlignment->get_fo_margin_left().get_value_or( length(0, length::pt) ).get_value_unit(length::pt) ); + int w_hanging = (int)( 0.5 - 20.0 * labelAlignment->fo_text_indent_.get_value_or( length(0, length::pt) ).get_value_unit(length::pt) ); + int w_left = (int)( 0.5 + 20.0 * labelAlignment->fo_margin_left_.get_value_or( length(0, length::pt) ).get_value_unit(length::pt) ); CP_XML_NODE(L"w:ind") { @@ -567,25 +567,31 @@ void text_list_level_style_number::pptx_convert(oox::pptx_conversion_context & C namespace { -wchar_t convert_bullet_char(wchar_t c) +std::wstring convert_bullet_char(std::wstring c) { //return c; - wchar_t res = c; - switch(c) - { - case L'\xE00C': res = L'\xF075';/*L'\xF0A8'*/; break; - case L'\xE00A': res = L'\xF0A7'; break; - case L'\x2611': res = L'\xF0FE'; break; - case L'\x2022': res = L'\x2022'; break; - case L'\x25CF': res = L'\xF0B7'; break; - case L'\x27A2': res = L'\xF0D8'; break; - case L'\x2714': res = L'\xF0FC'; break; - /*case L'\x25A0': res = L'\xF0A7'; break; */ - case L'\x25CB': res = L'\x006F'; break; - case L'\x2794': res = L'\xF0DA'; break; - case L'\x2717': res = L'\xF04F'; break; - case L'\x2013': res = L'\x2013'; break; - default:break; + std::wstring res; + + for(size_t i = 0; i < c.size(); ++i) + { + switch (c[i]) + { + case L'\xE00C': res += L'\xF075';/*L'\xF0A8'*/; break; + case L'\xE00A': res += L'\xF0A7'; break; + case L'\x2611': res += L'\xF0FE'; break; + case L'\x2022': res += L'\x2022'; res += L'\x20'; break; + case L'\x25CF': res += L'\xF0B7'; break; + case L'\x27A2': res += L'\xF0D8'; break; + case L'\x2714': res += L'\xF0FC'; break; + /*case L'\x25A0': res = L'\xF0A7'; break; */ + case L'\x25CB': res += L'\x006F'; break; + case L'\x2794': res += L'\xF0DA'; break; + case L'\x2717': res += L'\xF04F'; break; + case L'\x2013': res += L'\x2013'; break; + default: + res += c[i]; + break; + } } return res; } @@ -610,20 +616,19 @@ void text_list_level_style_bullet::docx_convert(oox::docx_conversion_context & C CP_XML_ATTR(L"w:ilvl",(text_list_level_style_attr_.get_text_level() - 1)); CP_XML_NODE(L"w:numFmt"){CP_XML_ATTR(L"w:val",L"bullet");} - CP_XML_NODE(L"w:suff") - { - if ((labelAlignment) && (labelAlignment->text_label_followed_by_)) + if ((labelAlignment) && (labelAlignment->text_label_followed_by_)) + { + CP_XML_NODE(L"w:suff") { - CP_XML_ATTR(L"w:val",labelAlignment->text_label_followed_by_.get() ); + CP_XML_ATTR(L"w:val", labelAlignment->text_label_followed_by_.get()); } - else - CP_XML_ATTR(L"w:val", L"tab"); } - const wchar_t bullet = text_list_level_style_bullet_attr_.text_bullet_char_.get_value_or(L'\x2022'); + std::wstring bullet = text_list_level_style_bullet_attr_.text_bullet_char_.get_value_or(L"\x2022"); CP_XML_NODE(L"w:lvlText") { - CP_XML_ATTR(L"w:val",convert_bullet_char(bullet)); + std::wstring out = convert_bullet_char(bullet); + CP_XML_ATTR(L"w:val", out); } docx_serialize_level_justification(CP_XML_STREAM(), listLevelProperties); @@ -648,7 +653,7 @@ void text_list_level_style_bullet::docx_convert(oox::docx_conversion_context & C if (labelAlignment) { - docx_serialize_label_alignment_props(CP_XML_STREAM(), labelAlignment); + docx_serialize_label_alignment_props(CP_XML_STREAM(), labelAlignment, false); } else { @@ -708,7 +713,7 @@ void text_list_level_style_bullet::pptx_convert(oox::pptx_conversion_context & C CP_XML_WRITER(strm) { style_text_properties * textProperties = dynamic_cast(style_text_properties_.get()); - wchar_t bullet = text_list_level_style_bullet_attr_.text_bullet_char_.get_value_or(L'\x2022'); + std::wstring bullet = text_list_level_style_bullet_attr_.text_bullet_char_.get_value_or(L"\x2022"); if (textProperties)///эти свойства относятся // к отрисовки значков !!! а не самого текста @@ -723,7 +728,7 @@ void text_list_level_style_bullet::pptx_convert(oox::pptx_conversion_context & C //{ // if (textProperties->content().style_font_charset_.get() == L"x-xsymbol")bullet = bullet + 0xf000; //} - CP_XML_ATTR(L"char",bullet/*convert_bullet_char(bullet)*/); + CP_XML_ATTR(L"char", bullet/*convert_bullet_char(bullet)*/); } } } @@ -747,21 +752,19 @@ void text_list_level_style_image::docx_convert(oox::docx_conversion_context & Co { CP_XML_ATTR(L"w:ilvl",(text_list_level_style_attr_.get_text_level() - 1)); CP_XML_NODE(L"w:numFmt"){CP_XML_ATTR(L"w:val",L"bullet");} - - CP_XML_NODE(L"w:suff") - { - if ((labelAlignment) && (labelAlignment->text_label_followed_by_)) + + if ((labelAlignment) && (labelAlignment->text_label_followed_by_)) + { + CP_XML_NODE(L"w:suff") { CP_XML_ATTR(L"w:val",labelAlignment->text_label_followed_by_.get() ); } - else - CP_XML_ATTR(L"w:val", L"tab"); } - const wchar_t bullet = L'\x2022'; + std::wstring bullet = L"\x2022"; CP_XML_NODE(L"w:lvlText") { - CP_XML_ATTR(L"w:val",convert_bullet_char(bullet)); + CP_XML_ATTR(L"w:val", bullet/*convert_bullet_char(bullet)*/); } docx_serialize_level_justification(CP_XML_STREAM(), listLevelProperties); @@ -786,7 +789,7 @@ void text_list_level_style_image::docx_convert(oox::docx_conversion_context & Co if (labelAlignment) { - docx_serialize_label_alignment_props(CP_XML_STREAM(), labelAlignment); + docx_serialize_label_alignment_props(CP_XML_STREAM(), labelAlignment, false); } else { diff --git a/ASCOfficeOdfFile/src/odf/styles_list.h b/ASCOfficeOdfFile/src/odf/styles_list.h index 428ae4aae9..c0f595a28a 100644 --- a/ASCOfficeOdfFile/src/odf/styles_list.h +++ b/ASCOfficeOdfFile/src/odf/styles_list.h @@ -162,12 +162,8 @@ private: virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); public: - const _CP_OPT(odf_types::length) & get_fo_text_indent() const { return fo_text_indent_; } - const _CP_OPT(odf_types::length) & get_fo_margin_left() const { return fo_margin_left_; } - const _CP_OPT(odf_types::length) & get_text_list_tab_stop_position() const { return text_list_tab_stop_position_; } + _CP_OPT(std::wstring) text_label_followed_by_; - _CP_OPT(std::wstring) text_label_followed_by_; -private: _CP_OPT(odf_types::length) text_list_tab_stop_position_; _CP_OPT(odf_types::length) fo_text_indent_; _CP_OPT(odf_types::length) fo_margin_left_; @@ -210,7 +206,7 @@ public: private: _CP_OPT(std::wstring) text_style_name_; - _CP_OPT(wchar_t) text_bullet_char_; + _CP_OPT(std::wstring) text_bullet_char_; odf_types::common_num_format_prefix_suffix_attlist common_num_format_prefix_suffix_attlist_; _CP_OPT(odf_types::percent) text_bullet_relative_size_; diff --git a/ASCOfficeOdfFile/src/odf/table_xlsx.cpp b/ASCOfficeOdfFile/src/odf/table_xlsx.cpp index f4238f3199..f8bd0fc7fa 100644 --- a/ASCOfficeOdfFile/src/odf/table_xlsx.cpp +++ b/ASCOfficeOdfFile/src/odf/table_xlsx.cpp @@ -904,7 +904,10 @@ void table_table_cell::xlsx_convert(oox::xlsx_conversion_context & Context) if (number_val.empty() && !bool_val) { - sharedStringId = content_.xlsx_convert(Context, textFormatProperties); + if (!formula.empty()) + xlsx_value_type = oox::XlsxCellType::str; + else + sharedStringId = content_.xlsx_convert(Context, textFormatProperties); } //--------------------------------------------------------------------------------------------------------- diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp index 24fc6319e5..07977a191c 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp +++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp @@ -1630,9 +1630,9 @@ void ods_table_state::end_conditional_format() { current_level_.pop_back(); } -void ods_table_state::start_conditional_rule(int rule_type) +void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent) { - office_element_ptr elm; + office_element_ptr elm; if (rule_type == 3) create_element(L"calcext", L"color-scale", elm, context_); else if (rule_type == 7)create_element(L"calcext", L"data-bar", elm ,context_); @@ -1680,7 +1680,16 @@ void ods_table_state::start_conditional_rule(int rule_type) case 11: condition->attr_.calcext_value_ = L"not-contains-text()"; break; case 12: condition->attr_.calcext_value_ = L"is-no-error"; break; case 13: condition->attr_.calcext_value_ = L"not-contains-text()"; break; - case 15: condition->attr_.calcext_value_ = L"top-elements()"; break;//bottom-elements ??? + case 15: + { + if ((bottom) && (*bottom)) condition->attr_.calcext_value_ = L"bottom"; + else condition->attr_.calcext_value_ = L"top"; + + if (percent && (*percent)) *condition->attr_.calcext_value_ += L"-percent("; + else *condition->attr_.calcext_value_ += L"-elements("; + + *condition->attr_.calcext_value_ += std::to_wstring(rank.get_value_or(10)) + L")"; + }break; case 16: condition->attr_.calcext_value_ = L"unique"; break; case 2: /*cellIs*/ default: break; diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h index e2f7304464..23e39e9747 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h +++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h @@ -375,7 +375,7 @@ public: void start_conditional_formats(); void start_conditional_format(std::wstring ref); - void start_conditional_rule(int rule_type); + void start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent); void set_conditional_formula(std::wstring formula); void set_conditional_value(int type, std::wstring value ); void set_conditional_iconset(int type_iconset); diff --git a/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp b/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp index a39a56138e..42d977dc93 100644 --- a/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp +++ b/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp @@ -3229,8 +3229,15 @@ void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_co if (!oox_cond_rule)return; if (false == oox_cond_rule->m_oType.IsInit()) return; + + _CP_OPT(unsigned int) rank; + _CP_OPT(bool) bottom, percent; - ods_context->current_table()->start_conditional_rule(oox_cond_rule->m_oType->GetValue()); + if (oox_cond_rule->m_oRank.IsInit()) rank = oox_cond_rule->m_oRank->GetValue(); + if (oox_cond_rule->m_oBottom.IsInit()) bottom = oox_cond_rule->m_oBottom->ToBool(); + if (oox_cond_rule->m_oPercent.IsInit()) percent = oox_cond_rule->m_oPercent->ToBool(); + + ods_context->current_table()->start_conditional_rule(oox_cond_rule->m_oType->GetValue(), rank, bottom, percent); { if (oox_cond_rule->m_oDxfId.IsInit()) { @@ -3249,7 +3256,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_co ods_context->current_table()->set_conditional_operator(oox_cond_rule->m_oOperator->GetValue()); if (oox_cond_rule->m_oText.IsInit()) - ods_context->current_table()->set_conditional_text(oox_cond_rule->m_oText.get2()); + ods_context->current_table()->set_conditional_text(*oox_cond_rule->m_oText); convert(oox_cond_rule->m_oIconSet.GetPointer()); convert(oox_cond_rule->m_oColorScale.GetPointer()); @@ -3315,7 +3322,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormatValueObject *oox if (oox_cond_value->m_oType.IsInit()) type = oox_cond_value->m_oType->GetValue(); if (oox_cond_value->m_oFormula.IsInit()) val = oox_cond_value->m_oFormula->m_sText; - else if (oox_cond_value->m_oVal.IsInit()) val = oox_cond_value->m_oVal.get2(); + else if (oox_cond_value->m_oVal.IsInit()) val = *oox_cond_value->m_oVal; ods_context->current_table()->set_conditional_value(type, val); } diff --git a/ASCOfficePPTFile/PPTFormatLib/Linux/PPTFormatLib.pro b/ASCOfficePPTFile/PPTFormatLib/Linux/PPTFormatLib.pro index 54359fa016..65e29bf1cf 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Linux/PPTFormatLib.pro +++ b/ASCOfficePPTFile/PPTFormatLib/Linux/PPTFormatLib.pro @@ -27,339 +27,13 @@ DEFINES += UNICODE \ #DISABLE_FILE_DOWNLOADER HEADERS += \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/Animations.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/Attributes.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/AudioOverlay.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/Document.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/Effects.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/Interactive.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/Metric.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/SlideShow.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/Structures.h \ -# ../../../ASCOfficePPTXFile/Editor/Drawing/XmlStringWriter.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/AlbumLayout.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/AnimationDgmBuild.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/BWMode.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/BaseLimit.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/BevelType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/BlendMode.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/BlipCompression.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/CameraType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/ChartBuild.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/ChartBuildType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/ColorSchemeIndex.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/CompoundLine.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/Conformance.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/ContentStatus.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/CornerDirectionVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/DgmBuild.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/DgmBuildType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/EffectContainerType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/EightDirectionVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/FillPath.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/Flip.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/FontAlign.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/FontStyleIndex.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/FrameShape.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/HorzOverflow.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/InOutDirectionVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/IterateType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/LastView.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/LightRigType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/LineCap.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/LineEndSize.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/LineEndType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/Material.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/OnOff.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/Orient.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/ParaBuildType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PathFillMode.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PattFillVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PenAlign.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PlaceholderSize.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PlaceholderType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PresetShadowVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PrstClrVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/PrstDashVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/RectAlign.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/SchemeClrVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/ShapeType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/SideDirectionVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/SlideLayoutType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/SlideSize.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/SplitterBarState.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/SysClrVal.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLAccumulate.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLAdditive.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLCalcMode.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLChartSubElement.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLColorDirection.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLColorSpace.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLCommandType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLMasterRelation.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLNextAc.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLNodeFillType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLNodeType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLOrigin.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLOverride.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLPathEditMode.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLPresetClass.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLPrevAc.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLRestart.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLRuntimeTrigger.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLSyncBehavior.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLTransform.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLTriggerEvent.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TLValueType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextAlign.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextAnchor.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextAutonumberScheme.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextCaps.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextShapeType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextStrike.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextTabAlignType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextUnderline.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextVerticalType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TextWrap.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/TransitionSpeed.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/VariantType.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Limit/VertOverflow.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Ah.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/AhBase.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/AhPolar.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/AhXY.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Backdrop.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bevel.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bg.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/BgPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/BodyPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuAutoNum.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuBlip.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuChar.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuClr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuClrTx.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuFontTx.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuNone.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuSzPct.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuSzPts.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BuSzTx.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/Bullet.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BulletColor.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BulletSize.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BulletTypeface.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CNvCxnSpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CNvGraphicFramePr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CNvGrpSpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CNvPicPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CNvPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CNvSpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CSld.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Camera.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Cell3D.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/ClrMap.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/ClrMapOvr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/ColorBase.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/ColorModifier.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/PrstClr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/SchemeClr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/SrgbClr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/SysClr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/ContentPart.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Controls.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CustGeom.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Cxn.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CxnSp.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/DefaultShapeDefinition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectDag.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectProperties.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaBiLevel.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaCeiling.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaFloor.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaInv.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaMod.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaModFix.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaOutset.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/AlphaRepl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/BiLevel.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/Blend.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/Blur.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/ClrChange.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/ClrRepl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/Duotone.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/EffectElement.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/FillEffect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/FillOverlay.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/Glow.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/Grayscl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/HslEffect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/InnerShdw.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/LumEffect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/OuterShdw.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/PrstShdw.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/Reflection.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/RelOff.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/SoftEdge.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/TintEffect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Effects/XfrmEffect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/ExtP.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/FillStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/Blip.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/BlipFill.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/GradFill.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/NoFill.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/PattFill.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/SolidFill.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/Stretch.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/Tile.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/FontCollection.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/FontRef.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Gd.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Geometry.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/GraphicFrame.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/GrpSpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Gs.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/HeadingVariant.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Hf.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Hyperlink.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/LightRig.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Lin.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/LineEnd.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/LineJoin.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/LineStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Ln.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Media/AudioCD.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Media/MediaFile.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Media/WavAudioFile.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvCxnSpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvGraphicFramePr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvGrpSpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvPicPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvSpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Paragraph.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/PartTitle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D/ArcTo.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D/Close.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D/CubicBezTo.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D/LineTo.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D/MoveTo.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D/PathBase.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Path2D/QuadBezTo.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Ph.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Pic.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/PrstDash.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/PrstGeom.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/PrstTxWarp.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Rect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Rot.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/RunElem.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/RunProperties.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Runs/Br.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Runs/Fld.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Runs/MathParaWrapper.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Runs/Run.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Runs/RunBase.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Scene3d.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Shape.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/ShapeStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SmartArt.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Sp3d.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SpPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SpTree.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SpTreeElem.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/StyleRef.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SupplementalFont.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Tab.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/Table.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/TableCell.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/TableCellProperties.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/TableCol.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/TableProperties.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/TableRow.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TableBgStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TablePartStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TableStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TcBdr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TcStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TcTxStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TextFit.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TextFont.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TextListStyle.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TextParagraphPr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TextSpacing.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Anim.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AnimClr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AnimEffect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AnimMotion.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AnimRot.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AnimScale.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AnimVariant.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AttrName.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/AttrNameLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Audio.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BldDgm.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BldGraphic.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BldLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BldOleChart.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BldP.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BldSub.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BuildNodeBase.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/CBhvr.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/CMediaNode.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/CTn.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/ChildTnLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Cmd.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Cond.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/CondLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Excl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/GraphicEl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Iterate.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Par.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Seq.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Set.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/SpTgt.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Tav.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/TavLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/TgtEl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/TimeNodeBase.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Timing.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Tmpl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/TmplLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/TnLst.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/TxEl.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/Video.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/CornerDirectionTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/EightDirectionTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/EmptyTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/OptionalBlackTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/OrientationTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/SideDirectionTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/SndAc.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/SplitTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/StSnd.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/Transition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/TransitionBase.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/WheelTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/ZoomTransition.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TxBody.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TxStyles.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniColor.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniEffect.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniFill.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniMedia.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniPath2D.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Xfrm.h \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/XmlId.h \ ../Enums/RecordType.h \ ../Enums/_includer.h \ ../Enums/enums.h \ ../PPTFormatLib.h \ ../PPTXWriter/Animation.h \ + ../PPTXWriter/TableWriter.h \ + ../PPTXWriter/TxBodyConverter.h \ ../Reader/ClassesAtom.h \ ../Reader/CommonZLib.h \ ../Reader/PPTDocumentInfo.h \ @@ -440,8 +114,11 @@ HEADERS += \ ../Records/BuildAtom.h \ ../Records/DocInfoListContainer.h \ ../Records/DocProgTagsContainer.h \ + ../Records/MouseInteractiveInfoContainer.h \ ../Records/OfficeArtClientData.h \ + ../Records/OfficeArtClientTextbox.h \ ../Records/PlaceHolderAtom.h \ + ../Records/RoundTripOArtTextStyles12Atom.h \ ../Records/ShapeProgBinaryTagSubContainerOrAtom.h \ ../Records/CFMasks.h \ ../Records/ColorSchemeAtom.h \ @@ -611,45 +288,12 @@ SOURCES += \ } SOURCES += \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Bg.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CNvGrpSpPr.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/SchemeClr.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/ContentPart.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Controls.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/CxnSp.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectDag.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectLst.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectProperties.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/EffectStyle.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/Blip.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Fills/BlipFill.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Geometry.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/GraphicFrame.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/GrpSpPr.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Hyperlink.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Media/WavAudioFile.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvGraphicFramePr.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/NvGrpSpPr.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Pic.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Runs/MathParaWrapper.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Shape.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SmartArt.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SpPr.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SpTree.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/SpTreeElem.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Table/TableCell.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/BuildNodeBase.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Timing/TimeNodeBase.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/TransitionBase.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/TxBody.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniColor.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniEffect.cpp \ -# ../../../ASCOfficePPTXFile/PPTXFormat/Logic/UniFill.cpp \ ../Enums/RecordType.cpp \ ../PPTFormatLib.cpp \ ../../../ASCOfficePPTXFile/Editor/Drawing/Elements.cpp \ ../../../ASCOfficePPTXFile/Editor/Drawing/TextAttributesEx.cpp \ ../../../Common/3dParty/pole/pole.cpp \ ../PPTXWriter/Animation.cpp \ + ../PPTXWriter/TableWriter.cpp \ + ../PPTXWriter/TxBodyConverter.cpp \ ../Records/Animations/TimeVariant.cpp - diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp index 606e8d1b25..aae42edeb8 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp @@ -1,1467 +1,1468 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2019 - * - * 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 20A-12 Ernesta Birznieka-Upisha - * street, Riga, Latvia, EU, LV-1050. - * - * 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 - * - */ -#pragma once - -#include "../../../ASCOfficePPTXFile/Editor/Drawing/Document.h" - -#include "../../../ASCOfficePPTXFile/Editor/DefaultNotesMaster.h" -#include "../../../ASCOfficePPTXFile/Editor/DefaultNotesTheme.h" - -#include "../../../Common/DocxFormat/Source/SystemUtility/SystemUtility.h" -#include "../../../ASCOfficeXlsFile2/source/Common/simple_xml_writer.h" -#include "../../../DesktopEditor/common/Directory.h" -#include "../../../DesktopEditor/common/SystemUtils.h" -#include "../Reader/PPTDocumentInfo.h" - -#include "ShapeWriter.h" -#include "StylesWriter.h" - -#include "Converter.h" -#include "Animation.h" - - -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/Transition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/TransitionBase.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/EmptyTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/OrientationTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/EightDirectionTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/OptionalBlackTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/SideDirectionTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/CornerDirectionTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/WheelTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/SplitTransition.h" -#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/ZoomTransition.h" - -namespace PPT_FORMAT -{ -namespace NSPPTXWriterConst -{ -static std::wstring g_string_rels_presentation = _T("\ - \ - \ - \ - \ - "); - - static std::wstring g_string_core = _T("\ - \ - Slide 1\ - 1\ - "); -} -} - - -PPT_FORMAT::CPPTXWriter::CPPTXWriter() -{ - m_strTempDirectory = NSDirectory::GetTempPath() + FILE_SEPARATOR_STR + _T("TempPPTX"); - m_strDstFileName = NSDirectory::GetTempPath() + FILE_SEPARATOR_STR + _T("Test.pptx"); - - m_pDocument = NULL; - m_pUserInfo = NULL; - - m_pShapeWriter = new CShapeWriter(); -} - -PPT_FORMAT::CPPTXWriter::~CPPTXWriter() -{ - RELEASEOBJECT(m_pShapeWriter); -} - -void PPT_FORMAT::CPPTXWriter::CreateFile(CPPTUserInfo* pUserInfo ) -{ - m_pUserInfo = pUserInfo; - - m_pDocument = dynamic_cast(pUserInfo); - - m_oManager.Clear(); - m_oManager.SetDstMedia(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("media") + FILE_SEPARATOR_STR); - - m_pShapeWriter->InitNextId(); - - NSDirectory::CreateDirectory(m_strTempDirectory); - CFile oFile; - std::wstring strMemory = _T(""); - - // _rels - NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels")); - - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + _T(".rels")); - strMemory = NSPPTXWriterConst::g_string_rels_presentation; - oFile.WriteStringUTF8(strMemory); - oFile.CloseFile(); - - // docProps - NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps")); - - // core - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("core.xml")); - strMemory = NSPPTXWriterConst::g_string_core; - oFile.WriteStringUTF8(strMemory); - oFile.CloseFile(); - - // app - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("app.xml")); - WriteApp(oFile); - oFile.CloseFile(); - - // content types - WriteContentTypes(); - - // ppt - NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt")); - WritePresInfo(); - - WriteAll(); -} - -void PPT_FORMAT::CPPTXWriter::CreateFile(CDocument* pDocument) -{ - m_pDocument = pDocument; - m_oManager.Clear(); - m_oManager.SetDstMedia(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("media") + FILE_SEPARATOR_STR); - - m_pShapeWriter->InitNextId(); - - NSDirectory::CreateDirectory(m_strTempDirectory); - CFile oFile; - std::wstring strMemory = _T(""); - - // _rels - NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels")); - - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + _T(".rels")); - strMemory = NSPPTXWriterConst::g_string_rels_presentation; - oFile.WriteStringUTF8(strMemory); - oFile.CloseFile(); - - // docProps - NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps")); - - // core - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("core.xml")); - strMemory = NSPPTXWriterConst::g_string_core; - oFile.WriteStringUTF8(strMemory); - oFile.CloseFile(); - - // app - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("app.xml")); - WriteApp(oFile); - oFile.CloseFile(); - - // content types - WriteContentTypes(); - - // ppt - NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt")); - WritePresInfo(); - - WriteAll(); -} - -void PPT_FORMAT::CPPTXWriter::CloseFile() -{ - m_oManager.Clear(); -} - - -void PPT_FORMAT::CPPTXWriter::WriteContentTypes() -{ - std::wstring strContentTypes = L"\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - "; - - if (m_pDocument->m_bMacros) - { - strContentTypes += L"\ - "; - } - else - { - strContentTypes += L""; - } - strContentTypes += L"\ - \ - \ - \ - "; - - int nIndexLayout = 1, nIndexTheme = 1; - - for (size_t nT = 0; nT < m_pDocument->m_arThemes.size(); nT++, nIndexTheme++) - { - strContentTypes += L""; - - strContentTypes += L""; - - - for (size_t nL = 0; nL < m_pDocument->m_arThemes[nT]->m_arLayouts.size(); nL++, nIndexLayout++) - { - strContentTypes += L""; - } - } - - if (m_pDocument->m_pNotesMaster) - { - strContentTypes += L""; - strContentTypes += L""; - } - if (m_pDocument->m_pHandoutMaster) - { - strContentTypes += L""; - strContentTypes += L""; - } - - for (size_t nS = 0; nS < m_pDocument->m_arSlides.size(); ++nS) - { - strContentTypes += L""; - } - - for (size_t nS = 0; nS < m_pDocument->m_arNotes.size(); ++nS) - { - strContentTypes += L""; - } - strContentTypes += _T(""); - - CFile oFile; - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("[Content_Types].xml")); - oFile.WriteStringUTF8(strContentTypes); - oFile.CloseFile(); -} - - -void PPT_FORMAT::CPPTXWriter::WriteApp(CFile& oFile) -{ - std::wstringstream strm; - - CP_XML_WRITER(strm) - { - CP_XML_NODE(L"Properties") - { - CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"); - CP_XML_ATTR(L"xmlns:vt", L"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); - - CP_XML_NODE(L"TotalTime") - { - CP_XML_STREAM() << 0; - } - CP_XML_NODE(L"Words") - { - CP_XML_STREAM() << 0; - } - std::wstring sApplication = NSSystemUtils::GetEnvVariable(NSSystemUtils::gc_EnvApplicationName); - if (sApplication.empty()) - sApplication = NSSystemUtils::gc_EnvApplicationNameDefault; -#if defined(INTVER) - std::string s = VALUE2STR(INTVER); - sApplication += L"/" + std::wstring(s.begin(), s.end()); -#endif - CP_XML_NODE(L"Application") - { - CP_XML_STREAM() << sApplication; - } - //CP_XML_NODE(L"AppVersion") - //{ - // CP_XML_STREAM() << L"1.0"; - //} - CP_XML_NODE(L"Paragraphs") - { - CP_XML_STREAM() << 0; - } - CP_XML_NODE(L"PresentationFormat") - { - CP_XML_STREAM() << L"On-screen Show (4:3)"; - } - CP_XML_NODE(L"Slides") - { - CP_XML_STREAM() << m_pDocument->m_arSlides.size(); - } - CP_XML_NODE(L"Notes") - { - CP_XML_STREAM() << m_pDocument->m_arNotes.size(); - } - CP_XML_NODE(L"HiddenSlides") - { - CP_XML_STREAM() << 0; - } - CP_XML_NODE(L"MMClips") - { - CP_XML_STREAM() << 0; - } - CP_XML_NODE(L"ScaleCrop") - { - CP_XML_STREAM() << L"false"; - } - CP_XML_NODE(L"HeadingPairs") - { - CP_XML_NODE(L"vt:vector") - { - CP_XML_ATTR(L"size", 4); - CP_XML_ATTR(L"baseType", L"variant"); - - CP_XML_NODE(L"vt:variant") - { - CP_XML_NODE(L"vt:lpstr") - { - CP_XML_STREAM() << L"Theme"; - } - } - CP_XML_NODE(L"vt:variant") - { - CP_XML_NODE(L"vt:i4") - { - CP_XML_STREAM() << m_pDocument->m_arThemes.size(); - } - } - CP_XML_NODE(L"vt:variant") - { - CP_XML_NODE(L"vt:lpstr") - { - CP_XML_STREAM() << L"Slide Titles"; - } - } - CP_XML_NODE(L"vt:variant") - { - CP_XML_NODE(L"vt:i4") - CP_XML_STREAM() << m_pDocument->m_arSlides.size(); - } - } - } - CP_XML_NODE(L"TitlesOfParts") - { - CP_XML_NODE(L"vt:vector") - { - CP_XML_ATTR(L"size", m_pDocument->m_arSlides.size() + m_pDocument->m_arThemes.size()); - CP_XML_ATTR(L"baseType", L"lpstr"); - - for (size_t i = 1; i <= m_pDocument->m_arThemes.size(); ++i) - { - CP_XML_NODE(L"vt:lpstr") - { - CP_XML_STREAM() << L"Theme " << i; - } - } - for (size_t i = 1; i <= m_pDocument->m_arSlides.size(); ++i) - { - CP_XML_NODE(L"vt:lpstr") - { - CP_XML_STREAM() << L"Slide " << i; - } - } - } - } - - //CP_XML_NODE(L"Company"); - CP_XML_NODE(L"LinksUpToDate") - { - CP_XML_STREAM() << L"false"; - } - CP_XML_NODE(L"SharedDoc") - { - CP_XML_STREAM() << L"false"; - } - CP_XML_NODE(L"HyperlinksChanged") - { - CP_XML_STREAM() << L"false"; - } - } - } - oFile.WriteStringUTF8(L""); - oFile.WriteStringUTF8(strm.str()); -} - -void PPT_FORMAT::CPPTXWriter::WritePresInfo() -{ - CFile oFile; - - // tableStyles.xml - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("tableStyles.xml")); - - oFile.WriteStringUTF8(L"\ - "); - oFile.CloseFile(); - - // presProps.xml - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("presProps.xml")); - oFile.WriteStringUTF8(L"\ - \ - \ - \ - \ - \ - "); - oFile.CloseFile(); - - // viewProps.xml - oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("viewProps.xml")); - oFile.WriteStringUTF8(L"\ - \ - \ - \ - \ - "); - oFile.CloseFile(); - - // presentation.xml + _rels/presentation.xml.rels - std::wstring strPresRels; - - std::wstring strPresMasters; - std::wstring strPresSlides; - std::wstring strNotesIDs; - std::wstring strHandoutIDs; - - size_t nCountLayouts = 0; - - for (size_t nIndexTheme = 0; nIndexTheme < m_pDocument->m_arThemes.size(); ++nIndexTheme) - { - strPresRels += L""; - - strPresRels += L""; - - strPresMasters += L""; - - nCountLayouts += m_pDocument->m_arThemes[nIndexTheme]->m_arLayouts.size(); - nCountLayouts += 1; - } - - int nCurrentRels = (int)(2 * m_pDocument->m_arThemes.size() + 1); - - if (m_pDocument->m_pNotesMaster) - { - strNotesIDs = L""; - strPresRels += L""; - ++nCurrentRels; - } - if (m_pDocument->m_pHandoutMaster) - { - strHandoutIDs = L""; - strPresRels += L""; - ++nCurrentRels; - } - for (size_t nIndexSlide = 0; nIndexSlide < m_pDocument->m_arSlides.size(); ++nIndexSlide, ++nCurrentRels) - { - strPresRels += L""; - - strPresSlides += L""; - } - - strPresRels += L""; - strPresRels += L""; - strPresRels += L""; - - if (m_pDocument->m_bMacros) - { - std::wstring strVbaProject = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("vbaProject.bin"); - - if (CDirectory::CopyFile(m_pDocument->m_sVbaProjectFile, strVbaProject)) - { - strPresRels += L""; - } - } - strPresRels = L"" - + strPresRels + L""; - - std::wstring strPptRels = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("_rels"); - - NSDirectory::CreateDirectory(strPptRels); - oFile.CreateFile(strPptRels + FILE_SEPARATOR_STR + _T("presentation.xml.rels")); - oFile.WriteStringUTF8(strPresRels); - oFile.CloseFile(); - - std::wstring strSizePres = L"m_lSlideWidth) + - L"\" cy=\"" + std::to_wstring(m_pDocument->m_lSlideHeight) + - L"\" type=\"screen4x3\" />m_lNotesWidth) + - L"\" cy=\"" + std::to_wstring(m_pDocument->m_lNotesHeight) + L"\"/>"; - - std::wstring strDefaultTextStyle = _T(""); - - if (false == m_pDocument->m_arThemes.empty()) - { - CStylesWriter styleWriter(m_pDocument->m_arThemes[0].get()); - strDefaultTextStyle += styleWriter.ConvertStyles(m_pDocument->m_arThemes[0]->m_pStyles[0], 9); - } - strDefaultTextStyle += _T(""); - - std::wstring strPres = _T(""); - strPres += _T("m_bRtl)) - { - strPres += _T(" rtl=\"1\""); - } - strPres += _T(">"); - strPres += _T("") + strPresMasters + _T(""); - strPres += strNotesIDs ; - strPres += strHandoutIDs ; - strPres +=_T("") + strPresSlides + _T(""); - strPres += strSizePres; - strPres += strDefaultTextStyle; - strPres +=_T(""); - - oFile.CreateFile(m_strTempDirectory+ FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("presentation.xml")); - oFile.WriteStringUTF8(strPres); - oFile.CloseFile(); -} - -void PPT_FORMAT::CPPTXWriter::WriteAll() -{ - std::wstring strPptDirectory = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR ; - - NSDirectory::CreateDirectory(strPptDirectory + _T("media")); - NSDirectory::CreateDirectory(strPptDirectory + _T("theme")); - NSDirectory::CreateDirectory(strPptDirectory + _T("slideMasters")); - NSDirectory::CreateDirectory(strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + _T("_rels")); - NSDirectory::CreateDirectory(strPptDirectory + _T("slideLayouts")); - NSDirectory::CreateDirectory(strPptDirectory + _T("slideLayouts") + FILE_SEPARATOR_STR + _T("_rels")); - NSDirectory::CreateDirectory(strPptDirectory + _T("slides")); - NSDirectory::CreateDirectory(strPptDirectory + _T("slides") + FILE_SEPARATOR_STR + _T("_rels")); - - if (m_pDocument->m_pHandoutMaster) - { - NSDirectory::CreateDirectory(strPptDirectory + _T("handoutMasters")); - NSDirectory::CreateDirectory(strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + _T("_rels")); - } - if (m_pDocument->m_pNotesMaster) - { - NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters")); - NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels")); - } - if (!m_pDocument->m_arNotes.empty()) - { - NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides")); - NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides") + FILE_SEPARATOR_STR + _T("_rels")); - } - WriteThemes(); - - WriteSlides(); - WriteNotes(); -} - -void PPT_FORMAT::CPPTXWriter::WriteThemes() -{ - int nStartLayout = 0, nIndexTheme = 0; - - for (size_t i = 0; i < m_pDocument->m_arThemes.size(); i++) - { - m_pShapeWriter->m_pTheme = m_pDocument->m_arThemes[i].get(); - WriteTheme(m_pDocument->m_arThemes[i], nIndexTheme, nStartLayout); - m_pShapeWriter->m_pTheme = NULL; - } - - WriteTheme(m_pDocument->m_pNotesMaster, nIndexTheme, nStartLayout); - WriteTheme(m_pDocument->m_pHandoutMaster, nIndexTheme, nStartLayout); -} - -void PPT_FORMAT::CPPTXWriter::WriteTheme(CThemePtr pTheme, int & nIndexTheme, int & nStartLayout) -{ - if (!pTheme) return; - - std::wstring strPptDirectory = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR ; - - std::wstring strThemeFile = L"theme" + std::to_wstring(nIndexTheme + 1) + L".xml"; - strThemeFile = strPptDirectory + _T("theme") + FILE_SEPARATOR_STR + strThemeFile; - - CFile oFile; - oFile.CreateFile(strThemeFile); - - PPT_FORMAT::CStringWriter oStringWriter; - - oStringWriter.WriteString(std::wstring(L"m_sThemeName); - oStringWriter.WriteString(std::wstring(L"\">")); - - WriteColorScheme(oStringWriter, L"Default", pTheme->m_arColorScheme); - - oStringWriter.WriteString(std::wstring(L"m_arFonts[0].Name); - oStringWriter.WriteString(std::wstring(L"\"/>")); - - oStringWriter.WriteString(std::wstring(L"m_arFonts.size() > 1 ) oStringWriter.WriteString (pTheme->m_arFonts[1].Name); - else oStringWriter.WriteStringXML(pTheme->m_arFonts[0].Name); - - oStringWriter.WriteString(std::wstring(L"\"/>")); - oStringWriter.WriteString(std::wstring(L"")); - - oStringWriter.WriteString(std::wstring(L"\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - ")); - - oStringWriter.WriteString(std::wstring(L"")); - oStringWriter.WriteString(std::wstring(L"")); - - for (size_t i = 0 ; i < pTheme->m_arExtraColorScheme.size(); i++) - { - std::wstring str = L" " + std::to_wstring(i + 1); - WriteColorScheme(oStringWriter, pTheme->m_sThemeName + str, pTheme->m_arExtraColorScheme[i], true); //extra - } - - oStringWriter.WriteString(std::wstring(L"")); - oStringWriter.WriteString(std::wstring(L"")); - - oFile.WriteStringUTF8(oStringWriter.GetData()); - oFile.CloseFile(); - - CRelsGenerator oRels(&m_oManager); - int nCountLayouts = (int)pTheme->m_arLayouts.size(); - oRels.StartMaster(nIndexTheme, nStartLayout, nCountLayouts); - - CStringWriter oWriter; - oWriter.WriteString(L""); - - if (pTheme->m_eType == typeMaster) - { - oWriter.WriteString(L""); - } - else if (pTheme->m_eType == typeNotesMaster) - { - oWriter.WriteString(L""); - } - else if (pTheme->m_eType == typeHandoutMaster) - { - oWriter.WriteString(L""); - } - oWriter.WriteString(L""); - - if (pTheme->m_bIsBackground) - { - WriteBackground(oWriter, oRels, pTheme->m_oBackground); - } - oWriter.WriteString(L"\ - "); - - CGroupElement *pGroupElement = !pTheme->m_arElements.empty() ? dynamic_cast(pTheme->m_arElements[0].get()) : NULL; - - size_t start_index = 0; - if (pGroupElement) - { - for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) - { - if (isBodyPlaceholder(pGroupElement->m_pChildElements[i]->m_lPlaceholderType)) - pGroupElement->m_pChildElements[i]->m_lPlaceholderType = 100; //body тип прописывать !! - - //if (pGroupElement->m_pChildElements[i]->m_bAnchorEnabled == false && - // pGroupElement->m_pChildElements[i]->m_bChildAnchorEnabled == false) - // continue; - - //if (pTheme->m_eType == typeNotesMaster) - //{ - // pGroupElement->m_pChildElements[i]->m_lPlaceholderID = -1; - //} - //else if (pTheme->m_eType == typeHandoutMaster) - //{ - // pGroupElement->m_pChildElements[i]->m_lPlaceholderID = -1; - // pGroupElement->m_pChildElements[i]->m_lPlaceholderSizePreset = -1; - //} - WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); - } - - start_index = 1; - } - - for (size_t i = start_index; i < pTheme->m_arElements.size(); ++i) - { - if (isBodyPlaceholder(pTheme->m_arElements[i]->m_lPlaceholderType)) - pTheme->m_arElements[i]->m_lPlaceholderType = 100; //body тип прописывать !! - - //if (pTheme->m_arElements[i]->m_bAnchorEnabled == false && - // pTheme->m_arElements[i]->m_bChildAnchorEnabled == false) - // continue; - - //if (pTheme->m_eType == typeNotesMaster) - //{ - // pTheme->m_arElements[i]->m_lPlaceholderID = -1; - //} - //else if (pTheme->m_eType == typeHandoutMaster) - //{ - // pTheme->m_arElements[i]->m_lPlaceholderID = -1; - // pTheme->m_arElements[i]->m_lPlaceholderSizePreset = -1; - //} - - WriteElement(oWriter, oRels, pTheme->m_arElements[i]); - } - - oWriter.WriteString(std::wstring(L"")); - - std::wstring strOverrideColorScheme = _T(""); - oWriter.WriteString(strOverrideColorScheme); - - if (pTheme->m_eType == typeMaster) - { - oWriter.WriteString(std::wstring(L"")); - - size_t __nCountLayouts = 0; - for (int nIndexLayout = 0; nIndexLayout < nCountLayouts; ++nIndexLayout) - { - oWriter.WriteString(L""); - - WriteLayout(pTheme->m_arLayouts[nIndexLayout], nIndexLayout, nStartLayout, nIndexTheme); - } - - oWriter.WriteString(std::wstring(L"")); - } - - if (pTheme->m_bHasDate || pTheme->m_bHasFooter || pTheme->m_bHasSlideNumber) - { - oWriter.WriteString(std::wstring(L"m_bHasDate) oWriter.WriteString(std::wstring(L" dt=\"0\"")); - if (!pTheme->m_bHasSlideNumber) oWriter.WriteString(std::wstring(L" sldNum=\"0\"")); - oWriter.WriteString(std::wstring(L" hdr=\"0\"")); - if (!pTheme->m_bHasFooter) oWriter.WriteString(std::wstring(L" ftr=\"0\"")); - oWriter.WriteString(std::wstring(L"/>")); - } - CStylesWriter styleWriter; - styleWriter.m_pTheme = pTheme.get(); - - if (pTheme->m_eType == typeMaster) - { - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"")); - styleWriter.ConvertStyles(pTheme->m_pStyles[1], oWriter, 9); - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"")); - styleWriter.ConvertStyles(pTheme->m_pStyles[2], oWriter, 9); - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"")); - styleWriter.ConvertStyles(pTheme->m_pStyles[3], oWriter, 9); - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"")); - } - else if (pTheme->m_eType == typeNotesMaster) - { - oWriter.WriteString(std::wstring(L"")); - styleWriter.ConvertStyles(pTheme->m_pStyles[1], oWriter, 9); - oWriter.WriteString(std::wstring(L"")); - } - - std::wstring strSlideMasterFile; - std::wstring strSlideMasterRelsFile; - if (pTheme->m_eType == typeMaster) - { - oWriter.WriteString(std::wstring(L"")); - - strSlideMasterFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml"; - strSlideMasterFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; - - strSlideMasterRelsFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml.rels"; - strSlideMasterRelsFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; - } - else if (pTheme->m_eType == typeNotesMaster) - { - oWriter.WriteString(std::wstring(L"")); - - strSlideMasterFile = L"notesMaster1.xml"; - strSlideMasterFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; - - strSlideMasterRelsFile = L"notesMaster1.xml.rels"; - strSlideMasterRelsFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; - } - else if (pTheme->m_eType == typeHandoutMaster) - { - oWriter.WriteString(std::wstring(L"")); - - strSlideMasterFile = L"handoutMaster1.xml"; - strSlideMasterFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; - - strSlideMasterRelsFile = L"handoutMaster1.xml.rels"; - strSlideMasterRelsFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; - } - oFile.CreateFile(strSlideMasterFile); - std::wstring strMaster = oWriter.GetData(); - oFile.WriteStringUTF8(strMaster); - oFile.CloseFile(); - - oRels.CloseRels(); - oRels.SaveRels(strSlideMasterRelsFile); - - nStartLayout += nCountLayouts; - nIndexTheme++; -} - -void PPT_FORMAT::CPPTXWriter::WriteColorScheme(CStringWriter& oStringWriter, const std::wstring & name, const std::vector & colors, bool extra) -{ - if (colors.size() < 1) - { - oStringWriter.WriteString(L"\ - \ - \ - \ - \ - "); - return; - } - - if (extra) - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - - oStringWriter.WriteString(L""); - if (extra) - { - oStringWriter.WriteString(L""); - oStringWriter.WriteString(L""); - } -} - -void PPT_FORMAT::CPPTXWriter::WriteBackground(CStringWriter& oWriter, CRelsGenerator& oRels, CBrush& oBackground) -{ - oWriter.WriteString(std::wstring(L"")); - - m_pShapeWriter->SetRelsGenerator(&oRels); - { - oWriter.WriteString(m_pShapeWriter->ConvertBrush(oBackground)); - } - oWriter.WriteString(std::wstring(L"")); -} -void PPT_FORMAT::CPPTXWriter::WriteGroup(CStringWriter& oWriter, CRelsGenerator& oRels, CElementPtr pElement, CLayout* pLayout) -{ - CGroupElement *pGroupElement = dynamic_cast(pElement.get()); - - m_pShapeWriter->SetElement(pElement); - oWriter.WriteString(m_pShapeWriter->ConvertGroup()); - - for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); i++) - { - WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i], pLayout); - } - oWriter.WriteString(L""); -} -void PPT_FORMAT::CPPTXWriter::WriteTable(CStringWriter& oWriter, CRelsGenerator& oRels, CElementPtr pElement, CLayout* pLayout) -{ - CGroupElement *pGroupElement = dynamic_cast(pElement.get()); - - m_pShapeWriter->SetElement(pElement); - oWriter.WriteString(m_pShapeWriter->ConvertTable()); - - oWriter.WriteString(m_pShapeWriter->ConvertTableCells()); - // for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); i++) - // { - // WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i], pLayout); - // } - oWriter.WriteString(L""); -} -void PPT_FORMAT::CPPTXWriter::WriteElement(CStringWriter& oWriter, CRelsGenerator& oRels, CElementPtr pElement, CLayout* pLayout) -{ - if (!pElement) return; - - CGroupElement *pGroupElement = dynamic_cast(pElement.get()); - - if (pGroupElement && pGroupElement->m_sName.find(L"Table") != -1) - return WriteTable(oWriter, oRels, pElement, pLayout); - if (pGroupElement) - { - return WriteGroup(oWriter, oRels, pElement, pLayout); - } - - bool bObject = m_pShapeWriter->SetElement(pElement); - - if (bObject) - { - m_pShapeWriter->SetRelsGenerator(&oRels); - - if (NULL != pLayout) - { - if (-1 != pElement->m_lPlaceholderType) - { - size_t nCountElements = pLayout->m_arElements.size(); - for (size_t nIndex = 0; nIndex < nCountElements; ++nIndex) - { - if ((pElement->m_lPlaceholderType == pLayout->m_arElements[nIndex]->m_lPlaceholderType) && - (pElement->m_lPlaceholderID == pLayout->m_arElements[nIndex]->m_lPlaceholderID)) - { - CElementPtr pElLayout = pLayout->m_arElements[nIndex]; - - bool bIsEqualTransform = ((pElement->m_dRotate == pElLayout->m_dRotate) - && (pElement->m_bFlipH == pElLayout->m_bFlipH) && (pElement->m_bFlipV == pElLayout->m_bFlipV)); - - if (bIsEqualTransform) - { - if (pElement->m_bAnchorEnabled == pElLayout->m_bAnchorEnabled && pElLayout->m_bAnchorEnabled == true) - { - if (pElement->m_rcAnchor.IsEqual(pElLayout->m_rcAnchor, 0.5)) - pElement->m_bAnchorEnabled = false; - } - if (pElement->m_bChildAnchorEnabled == pElLayout->m_bChildAnchorEnabled && pElLayout->m_bChildAnchorEnabled == true) - { - if (pElement->m_rcChildAnchor.IsEqual(pElLayout->m_rcChildAnchor, 0.5)) - pElement->m_bChildAnchorEnabled = false; - } - } - - break; - } - } - } - } - oWriter.WriteString(m_pShapeWriter->ConvertShape()); - } -} - -void PPT_FORMAT::CPPTXWriter::WriteLayout(CLayoutPtr pLayout, int nIndexLayout, int nStartLayout, int nIndexTheme) -{ - if (!pLayout) return; - - CStringWriter oWriter; - - CRelsGenerator oRels(&m_oManager); - oRels.StartLayout(nIndexTheme); - - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"m_strLayoutType + _T("\"")); - oWriter.WriteString(std::wstring(L" showMasterSp=\"") + (pLayout->m_bShowMasterShapes ? _T("1") : _T("0"))); - oWriter.WriteString(std::wstring(L"\" preserve=\"1\">m_sName.empty() == false) - oWriter.WriteString(std::wstring(L" name=\"") + pLayout->m_sName + std::wstring(L"\"")); - oWriter.WriteString(std::wstring(L">")); - - if (pLayout->m_bIsBackground) - { - WriteBackground(oWriter, oRels, pLayout->m_oBackground); - } - - std::wstring strElems = _T("\ - "); - oWriter.WriteString(strElems); - - size_t start_index = 0; - - if (pLayout->m_bIsTitleMaster) - { - CGroupElement *pGroupElement = (!pLayout->m_arElements.empty()) ? dynamic_cast(pLayout->m_arElements[0].get()) : NULL; - - if (pGroupElement) - { - for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) - { - WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); - } - - start_index = 1; - } - } - - for (size_t i = start_index; i < pLayout->m_arElements.size(); ++i) - { - WriteElement(oWriter, oRels, pLayout->m_arElements[i]); - } - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"")); - oWriter.WriteString(std::wstring(L"")); - - oRels.CloseRels(); - - std::wstring strXml = oWriter.GetData(); - std::wstring strFile = L"slideLayout" + std::to_wstring(nIndexLayout + nStartLayout + 1) + L".xml"; - - CFile oFile; - std::wstring strFileLayoutPath= m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("slideLayouts") + FILE_SEPARATOR_STR; - oFile.CreateFile(strFileLayoutPath + strFile); - oFile.WriteStringUTF8(strXml); - oFile.CloseFile(); - - strFile = L"slideLayout" + std::to_wstring(nIndexLayout + nStartLayout + 1) + L".xml.rels"; - oRels.SaveRels(strFileLayoutPath + _T("_rels") + FILE_SEPARATOR_STR + strFile); -} -void PPT_FORMAT::CPPTXWriter::WriteSlide(int nIndexSlide) -{ - CStringWriter oWriter; - CRelsGenerator oRels(&m_oManager); - - CSlide* pSlide = m_pDocument->m_arSlides[nIndexSlide]; - - if (0 == pSlide->m_lThemeID) - oRels.StartSlide(pSlide->m_lLayoutID, pSlide->m_lNotesID); - else - { - int nLayout = pSlide->m_lLayoutID; - for (int i = 0; i < pSlide->m_lThemeID; ++i) - { - nLayout += (int)m_pDocument->m_arThemes[i]->m_arLayouts.size(); - } - - oRels.StartSlide(nLayout, pSlide->m_lNotesID); - } - - oWriter.WriteString(std::wstring(L"")); - oWriter.WriteString(std::wstring(L"m_bShowMasterShapes) - oWriter.WriteString(std::wstring(L" showMasterSp=\"0\"")); - oWriter.WriteString(std::wstring(L">")); - - oWriter.WriteString(std::wstring(L"m_sName.empty() == false) - oWriter.WriteString(std::wstring(L" name=\"") + pSlide->m_sName + std::wstring(L"\"")); - - oWriter.WriteString(std::wstring(L">")); - - if (pSlide->m_bIsBackground) - { - WriteBackground(oWriter, oRels, pSlide->m_oBackground); - } - - oWriter.WriteString(std::wstring(L"\ - ")); - - CGroupElement *pGroupElement = !pSlide->m_arElements.empty() ? dynamic_cast(pSlide->m_arElements[0].get()) : NULL; - - size_t start_index = 0; - - if (pGroupElement) - { - for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) - { - WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); - } - - start_index = 1; - } - - for (size_t i = start_index; i < pSlide->m_arElements.size(); ++i) - { - WriteElement(oWriter, oRels, pSlide->m_arElements[i]); - } - - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"")); - - WriteTransition(oWriter, pSlide->m_oSlideShow); - - // TODO write new method and class for timing - WriteTiming(oWriter, oRels, nIndexSlide); - - - oWriter.WriteString(std::wstring(L"")); - - - - - oRels.CloseRels(); - - std::wstring strXml = oWriter.GetData(); - std::wstring strFile = L"slide" + std::to_wstring(nIndexSlide + 1) + L".xml"; - std::wstring strFileSlidePath= m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("slides") + FILE_SEPARATOR_STR; - - CFile oFile; - oFile.CreateFile(strFileSlidePath + strFile); - oFile.WriteStringUTF8(strXml); - oFile.CloseFile(); - - strFile = L"slide" + std::to_wstring(nIndexSlide + 1) + L".xml.rels"; - oRels.SaveRels(strFileSlidePath + _T("_rels") + FILE_SEPARATOR_STR + strFile); -} - -void PPT_FORMAT::CPPTXWriter::WriteTransition(CStringWriter& oWriter, CSlideShowInfo &oSSInfo) -{ - CTransition& transition = oSSInfo.m_oTransition; - PPTX::Logic::Transition Tr; - - std::wstring param_name, param_value; - std::wstring param_name2, param_value2; - - switch(transition.m_nEffectType) - { - case 1: - case 17: - case 18: - case 19: - case 22: - case 23: - case 27: - { - auto pTrBase = new PPTX::Logic::EmptyTransition(); - switch (transition.m_nEffectType) - { - case 1: pTrBase->name = L"random"; break; - case 17: pTrBase->name = L"diamond"; break; - case 18: pTrBase->name = L"plus"; break; - case 19: pTrBase->name = L"wedge"; break; - case 22: pTrBase->name = L"newsflash"; break; - case 23: pTrBase->name = L"fade"; break; - case 27: pTrBase->name = L"circle"; break; - } - Tr.base.base.reset(pTrBase); - }break; - case 2: - case 3: - case 8: - case 21: - { - auto pTrBase = new PPTX::Logic::OrientationTransition; - switch (transition.m_nEffectType) - { - case 2: pTrBase->name = L"blinds"; break; - case 3: pTrBase->name = L"checker"; break; - case 8: pTrBase->name = L"randomBar"; break; - case 21: pTrBase->name = L"comb"; break; - } - pTrBase->dir = new PPTX::Limit::Orient; - pTrBase->dir->SetBYTECode(transition.m_nEffectDirection); - Tr.base.base.reset(pTrBase); - }break; - case 0: - case 5: - case 6: - { - auto pTrBase = new PPTX::Logic::OptionalBlackTransition; - if (transition.m_nEffectType == 0) param_name = L"cut"; - else if (transition.m_nEffectType == 5) param_name = L"dissolve"; - else if (transition.m_nEffectType == 6) param_name = L"fade"; - pTrBase->thruBlk = transition.m_nEffectDirection; - }break; - case 4: - case 7: - { - auto pTrBase = new PPTX::Logic::EightDirectionTransition; - if (transition.m_nEffectType == 4) pTrBase->name = L"cover"; - else if (transition.m_nEffectType == 7) pTrBase->name = L"pull"; - - pTrBase->dir = new PPTX::Limit::EightDirectionVal; - switch(transition.m_nEffectDirection) - { - case 0: param_value = L"r"; break; - case 1: param_value = L"b"; break; - case 2: param_value = L"l"; break; - case 3: param_value = L"t"; break; - case 4: param_value = L"br"; break; - case 5: param_value = L"bl"; break; - case 6: param_value = L"tr"; break; - case 7: param_value = L"tl"; break; - } - pTrBase->dir->set(param_value); - Tr.base.base.reset(pTrBase); - }break; - case 9: - { - - auto pTrBase = new PPTX::Logic::CornerDirectionTransition; - pTrBase->name = L"strips"; - pTrBase->dir = new PPTX::Limit::CornerDirectionVal; - switch(transition.m_nEffectDirection) - { - case 0: param_value = L"ru"; break; - case 1: param_value = L"lu"; break; - case 2: param_value = L"rd"; break; - case 3: param_value = L"ld"; break; - } - pTrBase->dir->set(param_value); - Tr.base.base.reset(pTrBase); - }break; - case 10: - case 20: - { - auto pTrBase = new PPTX::Logic::SideDirectionTransition; - if (transition.m_nEffectType == 10) pTrBase->name = L"wipe"; - if (transition.m_nEffectType == 20) pTrBase->name = L"push"; - - pTrBase->dir = new PPTX::Limit::SideDirectionVal; - switch(transition.m_nEffectDirection) - { - case 0: param_value = L"l"; break; - case 1: param_value = L"u"; break; - case 2: param_value = L"r"; break; - case 3: param_value = L"d"; break; - } - pTrBase->dir->set(param_value); - Tr.base.base.reset(pTrBase); - }break; - case 11: - { - auto pTrBase = new PPTX::Logic::ZoomTransition; - pTrBase->dir = new PPTX::Limit::InOutDirectionVal; - pTrBase->dir->SetBYTECode(!transition.m_nEffectDirection); - Tr.base.base.reset(pTrBase); - }break; - case 13: - { - auto pTrBase = new PPTX::Logic::SplitTransition; - pTrBase->dir = new PPTX::Limit::InOutDirectionVal; - pTrBase->orient = new PPTX::Limit::Orient; - - switch(transition.m_nEffectDirection) - { - case 0: param_value2 = L"horz"; param_value = L"out"; break; - case 1: param_value2 = L"horz"; param_value = L"in"; break; - case 2: param_value2 = L"vert"; param_value = L"out"; break; - case 3: param_value2 = L"vert"; param_value = L"in"; break; - } - pTrBase->dir->set(param_value); - pTrBase->orient->set(param_value2); - - Tr.base.base.reset(pTrBase); - }break; - case 26: - { - auto pTrBase = new PPTX::Logic::WheelTransition; - pTrBase->spokes = transition.m_nEffectDirection; - Tr.base.base.reset(pTrBase); - }break; - default: - break; - } - - Tr.spd = new PPTX::Limit::TransitionSpeed; - // "2 -" переворот числа - Tr.spd->SetBYTECode(2 - transition.m_nSpeed); - - Tr.advClick = oSSInfo.m_bManulClick; - - if (oSSInfo.m_bAdvClick && - oSSInfo.m_dSlideDuration >= 0 && - oSSInfo.m_dSlideDuration <= 86399000) - { - Tr.advTm = oSSInfo.m_dSlideDuration; - } - if (transition.m_bAudioPresent) - { - bool bExternal = false; - std::wstring rId = m_pShapeWriter->m_pRels->WriteAudio(transition.m_oAudio.m_strAudioFileName, bExternal); - Tr.sndAc = new PPTX::Logic::SndAc; - Tr.sndAc->stSnd = new PPTX::Logic::StSnd; - Tr.sndAc->stSnd->name = XmlUtils::EncodeXmlString(transition.m_oAudio.m_sImageName); - Tr.sndAc->stSnd->embed = rId; - } - oWriter.WriteString(Tr.toXML()); -} - -void PPT_FORMAT::CPPTXWriter::WriteNotes(int nIndexNotes) -{ - CStringWriter oWriter; - CRelsGenerator oRels(&m_oManager); - - CSlide* pNotes = m_pDocument->m_arNotes[nIndexNotes]; - - oRels.StartNotes(pNotes->m_lSlideID, m_pDocument->m_pNotesMaster != NULL); - - oWriter.WriteString(std::wstring(L"")); - oWriter.WriteString(std::wstring(L"m_bShowMasterShapes) - oWriter.WriteString(std::wstring(L" showMasterSp=\"0\"")); - oWriter.WriteString(std::wstring(L">")); - - oWriter.WriteString(std::wstring(L"")); - - if (pNotes->m_bIsBackground) - { - WriteBackground(oWriter, oRels, pNotes->m_oBackground); - } - - oWriter.WriteString(std::wstring(L"\ - ")); - - CGroupElement *pGroupElement = !pNotes->m_arElements.empty() ? dynamic_cast(pNotes->m_arElements[0].get()) : NULL; - - size_t start_index = 0; - - if (pGroupElement) - { - for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) - { - WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); - } - - start_index = 1; - } - - for (size_t i = start_index; i < pNotes->m_arElements.size(); ++i) - { - WriteElement(oWriter, oRels, pNotes->m_arElements[i]); - } - - oWriter.WriteString(std::wstring(L"")); - - oWriter.WriteString(std::wstring(L"")); - oWriter.WriteString(std::wstring(L"")); - - oRels.CloseRels(); - - std::wstring strXml = oWriter.GetData(); - std::wstring strFile = L"notesSlide" + std::to_wstring(nIndexNotes + 1) + L".xml"; - std::wstring strFileSlidePath = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("notesSlides") + FILE_SEPARATOR_STR; - - CFile oFile; - oFile.CreateFile(strFileSlidePath + strFile); - oFile.WriteStringUTF8(strXml); - oFile.CloseFile(); - - strFile = L"notesSlide" + std::to_wstring(nIndexNotes + 1) + L".xml.rels"; - oRels.SaveRels(strFileSlidePath + _T("_rels") + FILE_SEPARATOR_STR + strFile); -} - -void PPT_FORMAT::CPPTXWriter::WriteSlides() -{ - m_oManager.WriteAudioCollection(m_pUserInfo->m_oExMedia.m_arAudioCollection); - for (size_t nIndexS = 0; nIndexS < m_pDocument->m_arSlides.size(); ++nIndexS) - { - WriteSlide((int)nIndexS); - } -} -void PPT_FORMAT::CPPTXWriter::WriteNotes() -{ - for (size_t nIndexS = 0; nIndexS < m_pDocument->m_arNotes.size(); ++nIndexS) - { - WriteNotes((int)nIndexS); - } -} - - -void PPT_FORMAT::CPPTXWriter::WriteTiming(CStringWriter& oWriter, CRelsGenerator &oRels, int nIndexSlide) -{ - PPTX::Logic::Timing oTiming; - - auto slide_iter = m_pUserInfo->m_mapSlides.find(m_pUserInfo->m_arrSlidesOrder[nIndexSlide]); - // This part for new animation - CRecordSlideProgTagsContainer* progTag = slide_iter->second->m_pSlideProgTagsContainer; - CRecordPP10SlideBinaryTagExtension* pPP10SlideBinaryTag = progTag ? progTag->getPP10SlideBinaryTagExtension() : NULL; - // This part for old animation - std::vector arrShapeCont; - slide_iter->second->GetRecordsByType(&arrShapeCont, true); - std::vector arrOldAnim; - for (auto ShapeCont : arrShapeCont) - { - SOldAnimation oldAnim; - std::vector shape; - ShapeCont->GetRecordsByType(&shape, true); - std::vector anim; - ShapeCont->GetRecordsByType(&anim, true); - if (!anim.empty() && !shape.empty()) - { - oldAnim.shapeId = shape[0]->m_nID; - oldAnim.anim = anim[0]; - arrOldAnim.push_back(oldAnim); - } - } - - if (!pPP10SlideBinaryTag && arrOldAnim.empty()) - return; - - Animation animation(pPP10SlideBinaryTag, arrOldAnim, &(m_pUserInfo->m_oExMedia), &oRels); - - animation.Convert(oTiming); - oWriter.WriteString(oTiming.toXML()); - //oWriter.WriteString(std::wstring(L"")); - -} +/* + * (c) Copyright Ascensio System SIA 2010-2019 + * + * 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 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * 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 + * + */ +#pragma once + +#include "../../../ASCOfficePPTXFile/Editor/Drawing/Document.h" + +#include "../../../ASCOfficePPTXFile/Editor/DefaultNotesMaster.h" +#include "../../../ASCOfficePPTXFile/Editor/DefaultNotesTheme.h" + +#include "../../../Common/DocxFormat/Source/SystemUtility/SystemUtility.h" +#include "../../../ASCOfficeXlsFile2/source/Common/simple_xml_writer.h" +#include "../../../DesktopEditor/common/Directory.h" +#include "../../../DesktopEditor/common/SystemUtils.h" +#include "../Reader/PPTDocumentInfo.h" + +#include "ShapeWriter.h" +#include "StylesWriter.h" + +#include "Converter.h" +#include "Animation.h" + + +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/Transition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/TransitionBase.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/EmptyTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/OrientationTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/EightDirectionTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/OptionalBlackTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/SideDirectionTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/CornerDirectionTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/WheelTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/SplitTransition.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Transitions/ZoomTransition.h" + +namespace PPT_FORMAT +{ +namespace NSPPTXWriterConst +{ +static std::wstring g_string_rels_presentation = _T("\ + \ + \ + \ + \ + "); + + static std::wstring g_string_core = _T("\ + \ + Slide 1\ + 1\ + "); +} +} + + +PPT_FORMAT::CPPTXWriter::CPPTXWriter() +{ + m_strTempDirectory = NSDirectory::GetTempPath() + FILE_SEPARATOR_STR + _T("TempPPTX"); + m_strDstFileName = NSDirectory::GetTempPath() + FILE_SEPARATOR_STR + _T("Test.pptx"); + + m_pDocument = NULL; + m_pUserInfo = NULL; + + m_pShapeWriter = new CShapeWriter(); +} + +PPT_FORMAT::CPPTXWriter::~CPPTXWriter() +{ + RELEASEOBJECT(m_pShapeWriter); +} + +void PPT_FORMAT::CPPTXWriter::CreateFile(CPPTUserInfo* pUserInfo ) +{ + m_pUserInfo = pUserInfo; + + m_pDocument = dynamic_cast(pUserInfo); + + m_oManager.Clear(); + m_oManager.SetDstMedia(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("media") + FILE_SEPARATOR_STR); + + m_pShapeWriter->InitNextId(); + + NSDirectory::CreateDirectory(m_strTempDirectory); + CFile oFile; + std::wstring strMemory = _T(""); + + // _rels + NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels")); + + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + _T(".rels")); + strMemory = NSPPTXWriterConst::g_string_rels_presentation; + oFile.WriteStringUTF8(strMemory); + oFile.CloseFile(); + + // docProps + NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps")); + + // core + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("core.xml")); + strMemory = NSPPTXWriterConst::g_string_core; + oFile.WriteStringUTF8(strMemory); + oFile.CloseFile(); + + // app + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("app.xml")); + WriteApp(oFile); + oFile.CloseFile(); + + // content types + WriteContentTypes(); + + // ppt + NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt")); + WritePresInfo(); + + WriteAll(); +} + +void PPT_FORMAT::CPPTXWriter::CreateFile(CDocument* pDocument) +{ + m_pDocument = pDocument; + m_oManager.Clear(); + m_oManager.SetDstMedia(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("media") + FILE_SEPARATOR_STR); + + m_pShapeWriter->InitNextId(); + + NSDirectory::CreateDirectory(m_strTempDirectory); + CFile oFile; + std::wstring strMemory = _T(""); + + // _rels + NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels")); + + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + _T(".rels")); + strMemory = NSPPTXWriterConst::g_string_rels_presentation; + oFile.WriteStringUTF8(strMemory); + oFile.CloseFile(); + + // docProps + NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps")); + + // core + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("core.xml")); + strMemory = NSPPTXWriterConst::g_string_core; + oFile.WriteStringUTF8(strMemory); + oFile.CloseFile(); + + // app + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("docProps") + FILE_SEPARATOR_STR + _T("app.xml")); + WriteApp(oFile); + oFile.CloseFile(); + + // content types + WriteContentTypes(); + + // ppt + NSDirectory::CreateDirectory(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt")); + WritePresInfo(); + + WriteAll(); +} + +void PPT_FORMAT::CPPTXWriter::CloseFile() +{ + m_oManager.Clear(); +} + + +void PPT_FORMAT::CPPTXWriter::WriteContentTypes() +{ + std::wstring strContentTypes = L"\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + "; + + if (m_pDocument->m_bMacros) + { + strContentTypes += L"\ + "; + } + else + { + strContentTypes += L""; + } + strContentTypes += L"\ + \ + \ + \ + "; + + int nIndexLayout = 1, nIndexTheme = 1; + + for (size_t nT = 0; nT < m_pDocument->m_arThemes.size(); nT++, nIndexTheme++) + { + strContentTypes += L""; + + strContentTypes += L""; + + + for (size_t nL = 0; nL < m_pDocument->m_arThemes[nT]->m_arLayouts.size(); nL++, nIndexLayout++) + { + strContentTypes += L""; + } + } + + if (m_pDocument->m_pNotesMaster) + { + strContentTypes += L""; + strContentTypes += L""; + } + if (m_pDocument->m_pHandoutMaster) + { + strContentTypes += L""; + strContentTypes += L""; + } + + for (size_t nS = 0; nS < m_pDocument->m_arSlides.size(); ++nS) + { + strContentTypes += L""; + } + + for (size_t nS = 0; nS < m_pDocument->m_arNotes.size(); ++nS) + { + strContentTypes += L""; + } + strContentTypes += _T(""); + + CFile oFile; + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("[Content_Types].xml")); + oFile.WriteStringUTF8(strContentTypes); + oFile.CloseFile(); +} + + +void PPT_FORMAT::CPPTXWriter::WriteApp(CFile& oFile) +{ + std::wstringstream strm; + + CP_XML_WRITER(strm) + { + CP_XML_NODE(L"Properties") + { + CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"); + CP_XML_ATTR(L"xmlns:vt", L"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + + CP_XML_NODE(L"TotalTime") + { + CP_XML_STREAM() << 0; + } + CP_XML_NODE(L"Words") + { + CP_XML_STREAM() << 0; + } + std::wstring sApplication = NSSystemUtils::GetEnvVariable(NSSystemUtils::gc_EnvApplicationName); + if (sApplication.empty()) + sApplication = NSSystemUtils::gc_EnvApplicationNameDefault; +#if defined(INTVER) + std::string s = VALUE2STR(INTVER); + sApplication += L"/" + std::wstring(s.begin(), s.end()); +#endif + CP_XML_NODE(L"Application") + { + CP_XML_STREAM() << sApplication; + } + //CP_XML_NODE(L"AppVersion") + //{ + // CP_XML_STREAM() << L"1.0"; + //} + CP_XML_NODE(L"Paragraphs") + { + CP_XML_STREAM() << 0; + } + CP_XML_NODE(L"PresentationFormat") + { + CP_XML_STREAM() << L"On-screen Show (4:3)"; + } + CP_XML_NODE(L"Slides") + { + CP_XML_STREAM() << m_pDocument->m_arSlides.size(); + } + CP_XML_NODE(L"Notes") + { + CP_XML_STREAM() << m_pDocument->m_arNotes.size(); + } + CP_XML_NODE(L"HiddenSlides") + { + CP_XML_STREAM() << 0; + } + CP_XML_NODE(L"MMClips") + { + CP_XML_STREAM() << 0; + } + CP_XML_NODE(L"ScaleCrop") + { + CP_XML_STREAM() << L"false"; + } + CP_XML_NODE(L"HeadingPairs") + { + CP_XML_NODE(L"vt:vector") + { + CP_XML_ATTR(L"size", 4); + CP_XML_ATTR(L"baseType", L"variant"); + + CP_XML_NODE(L"vt:variant") + { + CP_XML_NODE(L"vt:lpstr") + { + CP_XML_STREAM() << L"Theme"; + } + } + CP_XML_NODE(L"vt:variant") + { + CP_XML_NODE(L"vt:i4") + { + CP_XML_STREAM() << m_pDocument->m_arThemes.size(); + } + } + CP_XML_NODE(L"vt:variant") + { + CP_XML_NODE(L"vt:lpstr") + { + CP_XML_STREAM() << L"Slide Titles"; + } + } + CP_XML_NODE(L"vt:variant") + { + CP_XML_NODE(L"vt:i4") + CP_XML_STREAM() << m_pDocument->m_arSlides.size(); + } + } + } + CP_XML_NODE(L"TitlesOfParts") + { + CP_XML_NODE(L"vt:vector") + { + CP_XML_ATTR(L"size", m_pDocument->m_arSlides.size() + m_pDocument->m_arThemes.size()); + CP_XML_ATTR(L"baseType", L"lpstr"); + + for (size_t i = 1; i <= m_pDocument->m_arThemes.size(); ++i) + { + CP_XML_NODE(L"vt:lpstr") + { + CP_XML_STREAM() << L"Theme " << i; + } + } + for (size_t i = 1; i <= m_pDocument->m_arSlides.size(); ++i) + { + CP_XML_NODE(L"vt:lpstr") + { + CP_XML_STREAM() << L"Slide " << i; + } + } + } + } + + //CP_XML_NODE(L"Company"); + CP_XML_NODE(L"LinksUpToDate") + { + CP_XML_STREAM() << L"false"; + } + CP_XML_NODE(L"SharedDoc") + { + CP_XML_STREAM() << L"false"; + } + CP_XML_NODE(L"HyperlinksChanged") + { + CP_XML_STREAM() << L"false"; + } + } + } + oFile.WriteStringUTF8(L""); + oFile.WriteStringUTF8(strm.str()); +} + +void PPT_FORMAT::CPPTXWriter::WritePresInfo() +{ + CFile oFile; + + // tableStyles.xml + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("tableStyles.xml")); + + oFile.WriteStringUTF8(L"\ + "); + oFile.CloseFile(); + + // presProps.xml + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("presProps.xml")); + oFile.WriteStringUTF8(L"\ + \ + \ + \ + \ + \ + "); + oFile.CloseFile(); + + // viewProps.xml + oFile.CreateFile(m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("viewProps.xml")); + oFile.WriteStringUTF8(L"\ + \ + \ + \ + \ + "); + oFile.CloseFile(); + + // presentation.xml + _rels/presentation.xml.rels + std::wstring strPresRels; + + std::wstring strPresMasters; + std::wstring strPresSlides; + std::wstring strNotesIDs; + std::wstring strHandoutIDs; + + size_t nCountLayouts = 0; + + for (size_t nIndexTheme = 0; nIndexTheme < m_pDocument->m_arThemes.size(); ++nIndexTheme) + { + strPresRels += L""; + + strPresRels += L""; + + strPresMasters += L""; + + nCountLayouts += m_pDocument->m_arThemes[nIndexTheme]->m_arLayouts.size(); + nCountLayouts += 1; + } + + int nCurrentRels = (int)(2 * m_pDocument->m_arThemes.size() + 1); + + if (m_pDocument->m_pNotesMaster) + { + strNotesIDs = L""; + strPresRels += L""; + ++nCurrentRels; + } + if (m_pDocument->m_pHandoutMaster) + { + strHandoutIDs = L""; + strPresRels += L""; + ++nCurrentRels; + } + for (size_t nIndexSlide = 0; nIndexSlide < m_pDocument->m_arSlides.size(); ++nIndexSlide, ++nCurrentRels) + { + strPresRels += L""; + + strPresSlides += L""; + } + + strPresRels += L""; + strPresRels += L""; + strPresRels += L""; + + if (m_pDocument->m_bMacros) + { + std::wstring strVbaProject = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("vbaProject.bin"); + + if (CDirectory::CopyFile(m_pDocument->m_sVbaProjectFile, strVbaProject)) + { + strPresRels += L""; + } + } + strPresRels = L"" + + strPresRels + L""; + + std::wstring strPptRels = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("_rels"); + + NSDirectory::CreateDirectory(strPptRels); + oFile.CreateFile(strPptRels + FILE_SEPARATOR_STR + _T("presentation.xml.rels")); + oFile.WriteStringUTF8(strPresRels); + oFile.CloseFile(); + + std::wstring strSizePres = L"m_lSlideWidth) + + L"\" cy=\"" + std::to_wstring(m_pDocument->m_lSlideHeight) + + L"\" type=\"screen4x3\" />m_lNotesWidth) + + L"\" cy=\"" + std::to_wstring(m_pDocument->m_lNotesHeight) + L"\"/>"; + + std::wstring strDefaultTextStyle = _T(""); + + if (false == m_pDocument->m_arThemes.empty()) + { + CStylesWriter styleWriter(m_pDocument->m_arThemes[0].get()); + strDefaultTextStyle += styleWriter.ConvertStyles(m_pDocument->m_arThemes[0]->m_pStyles[0], 9); + } + strDefaultTextStyle += _T(""); + + std::wstring strPres = _T(""); + strPres += _T("m_bRtl)) + { + strPres += _T(" rtl=\"1\""); + } + strPres += _T(">"); + strPres += _T("") + strPresMasters + _T(""); + strPres += strNotesIDs ; + strPres += strHandoutIDs ; + strPres +=_T("") + strPresSlides + _T(""); + strPres += strSizePres; + strPres += strDefaultTextStyle; + strPres +=_T(""); + + oFile.CreateFile(m_strTempDirectory+ FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("presentation.xml")); + oFile.WriteStringUTF8(strPres); + oFile.CloseFile(); +} + +void PPT_FORMAT::CPPTXWriter::WriteAll() +{ + std::wstring strPptDirectory = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR ; + + NSDirectory::CreateDirectory(strPptDirectory + _T("media")); + NSDirectory::CreateDirectory(strPptDirectory + _T("theme")); + NSDirectory::CreateDirectory(strPptDirectory + _T("slideMasters")); + NSDirectory::CreateDirectory(strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + _T("_rels")); + NSDirectory::CreateDirectory(strPptDirectory + _T("slideLayouts")); + NSDirectory::CreateDirectory(strPptDirectory + _T("slideLayouts") + FILE_SEPARATOR_STR + _T("_rels")); + NSDirectory::CreateDirectory(strPptDirectory + _T("slides")); + NSDirectory::CreateDirectory(strPptDirectory + _T("slides") + FILE_SEPARATOR_STR + _T("_rels")); + + if (m_pDocument->m_pHandoutMaster) + { + NSDirectory::CreateDirectory(strPptDirectory + _T("handoutMasters")); + NSDirectory::CreateDirectory(strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + _T("_rels")); + } + if (m_pDocument->m_pNotesMaster) + { + NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters")); + NSDirectory::CreateDirectory(strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels")); + } + if (!m_pDocument->m_arNotes.empty()) + { + NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides")); + NSDirectory::CreateDirectory(strPptDirectory + _T("notesSlides") + FILE_SEPARATOR_STR + _T("_rels")); + } + WriteThemes(); + + WriteSlides(); + WriteNotes(); +} + +void PPT_FORMAT::CPPTXWriter::WriteThemes() +{ + int nStartLayout = 0, nIndexTheme = 0; + + for (size_t i = 0; i < m_pDocument->m_arThemes.size(); i++) + { + m_pShapeWriter->m_pTheme = m_pDocument->m_arThemes[i].get(); + WriteTheme(m_pDocument->m_arThemes[i], nIndexTheme, nStartLayout); + m_pShapeWriter->m_pTheme = NULL; + } + + WriteTheme(m_pDocument->m_pNotesMaster, nIndexTheme, nStartLayout); + WriteTheme(m_pDocument->m_pHandoutMaster, nIndexTheme, nStartLayout); +} + +void PPT_FORMAT::CPPTXWriter::WriteTheme(CThemePtr pTheme, int & nIndexTheme, int & nStartLayout) +{ + if (!pTheme) return; + + std::wstring strPptDirectory = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR ; + + std::wstring strThemeFile = L"theme" + std::to_wstring(nIndexTheme + 1) + L".xml"; + strThemeFile = strPptDirectory + _T("theme") + FILE_SEPARATOR_STR + strThemeFile; + + CFile oFile; + oFile.CreateFile(strThemeFile); + + PPT_FORMAT::CStringWriter oStringWriter; + + oStringWriter.WriteString(std::wstring(L"m_sThemeName); + oStringWriter.WriteString(std::wstring(L"\">")); + + WriteColorScheme(oStringWriter, L"Default", pTheme->m_arColorScheme); + + oStringWriter.WriteString(std::wstring(L"m_arFonts[0].Name); + oStringWriter.WriteString(std::wstring(L"\"/>")); + + oStringWriter.WriteString(std::wstring(L"m_arFonts.size() > 1 ) oStringWriter.WriteString (pTheme->m_arFonts[1].Name); + else oStringWriter.WriteStringXML(pTheme->m_arFonts[0].Name); + + oStringWriter.WriteString(std::wstring(L"\"/>")); + oStringWriter.WriteString(std::wstring(L"")); + + oStringWriter.WriteString(std::wstring(L"\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + ")); + + oStringWriter.WriteString(std::wstring(L"")); + oStringWriter.WriteString(std::wstring(L"")); + + for (size_t i = 0 ; i < pTheme->m_arExtraColorScheme.size(); i++) + { + std::wstring str = L" " + std::to_wstring(i + 1); + WriteColorScheme(oStringWriter, pTheme->m_sThemeName + str, pTheme->m_arExtraColorScheme[i], true); //extra + } + + oStringWriter.WriteString(std::wstring(L"")); + oStringWriter.WriteString(std::wstring(L"")); + + oFile.WriteStringUTF8(oStringWriter.GetData()); + oFile.CloseFile(); + + CRelsGenerator oRels(&m_oManager); + int nCountLayouts = (int)pTheme->m_arLayouts.size(); + oRels.StartMaster(nIndexTheme, nStartLayout, nCountLayouts); + + CStringWriter oWriter; + oWriter.WriteString(L""); + + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(L""); + } + else if (pTheme->m_eType == typeNotesMaster) + { + oWriter.WriteString(L""); + } + else if (pTheme->m_eType == typeHandoutMaster) + { + oWriter.WriteString(L""); + } + oWriter.WriteString(L""); + + if (pTheme->m_bIsBackground) + { + WriteBackground(oWriter, oRels, pTheme->m_oBackground); + } + oWriter.WriteString(L"\ + "); + + CGroupElement *pGroupElement = !pTheme->m_arElements.empty() ? dynamic_cast(pTheme->m_arElements[0].get()) : NULL; + + size_t start_index = 0; + if (pGroupElement) + { + for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) + { + if (isBodyPlaceholder(pGroupElement->m_pChildElements[i]->m_lPlaceholderType)) + pGroupElement->m_pChildElements[i]->m_lPlaceholderType = 100; //body тип прописывать !! + + //if (pGroupElement->m_pChildElements[i]->m_bAnchorEnabled == false && + // pGroupElement->m_pChildElements[i]->m_bChildAnchorEnabled == false) + // continue; + + //if (pTheme->m_eType == typeNotesMaster) + //{ + // pGroupElement->m_pChildElements[i]->m_lPlaceholderID = -1; + //} + //else if (pTheme->m_eType == typeHandoutMaster) + //{ + // pGroupElement->m_pChildElements[i]->m_lPlaceholderID = -1; + // pGroupElement->m_pChildElements[i]->m_lPlaceholderSizePreset = -1; + //} + WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); + } + + start_index = 1; + } + + for (size_t i = start_index; i < pTheme->m_arElements.size(); ++i) + { + if (isBodyPlaceholder(pTheme->m_arElements[i]->m_lPlaceholderType)) + pTheme->m_arElements[i]->m_lPlaceholderType = 100; //body тип прописывать !! + + //if (pTheme->m_arElements[i]->m_bAnchorEnabled == false && + // pTheme->m_arElements[i]->m_bChildAnchorEnabled == false) + // continue; + + //if (pTheme->m_eType == typeNotesMaster) + //{ + // pTheme->m_arElements[i]->m_lPlaceholderID = -1; + //} + //else if (pTheme->m_eType == typeHandoutMaster) + //{ + // pTheme->m_arElements[i]->m_lPlaceholderID = -1; + // pTheme->m_arElements[i]->m_lPlaceholderSizePreset = -1; + //} + + WriteElement(oWriter, oRels, pTheme->m_arElements[i]); + } + + oWriter.WriteString(std::wstring(L"")); + + std::wstring strOverrideColorScheme = _T(""); + oWriter.WriteString(strOverrideColorScheme); + + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(std::wstring(L"")); + + size_t __nCountLayouts = 0; + for (int nIndexLayout = 0; nIndexLayout < nCountLayouts; ++nIndexLayout) + { + oWriter.WriteString(L""); + + WriteLayout(pTheme->m_arLayouts[nIndexLayout], nIndexLayout, nStartLayout, nIndexTheme); + } + + oWriter.WriteString(std::wstring(L"")); + } + + if (pTheme->m_bHasDate || pTheme->m_bHasFooter || pTheme->m_bHasSlideNumber) + { + oWriter.WriteString(std::wstring(L"m_bHasDate) oWriter.WriteString(std::wstring(L" dt=\"0\"")); + if (!pTheme->m_bHasSlideNumber) oWriter.WriteString(std::wstring(L" sldNum=\"0\"")); + oWriter.WriteString(std::wstring(L" hdr=\"0\"")); + if (!pTheme->m_bHasFooter) oWriter.WriteString(std::wstring(L" ftr=\"0\"")); + oWriter.WriteString(std::wstring(L"/>")); + } + CStylesWriter styleWriter; + styleWriter.m_pTheme = pTheme.get(); + + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[1], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[2], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[3], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + } + else if (pTheme->m_eType == typeNotesMaster) + { + oWriter.WriteString(std::wstring(L"")); + styleWriter.ConvertStyles(pTheme->m_pStyles[1], oWriter, 9); + oWriter.WriteString(std::wstring(L"")); + } + + std::wstring strSlideMasterFile; + std::wstring strSlideMasterRelsFile; + if (pTheme->m_eType == typeMaster) + { + oWriter.WriteString(std::wstring(L"")); + + strSlideMasterFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml"; + strSlideMasterFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; + + strSlideMasterRelsFile = L"slideMaster" + std::to_wstring(nIndexTheme + 1) + L".xml.rels"; + strSlideMasterRelsFile = strPptDirectory + _T("slideMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; + } + else if (pTheme->m_eType == typeNotesMaster) + { + oWriter.WriteString(std::wstring(L"")); + + strSlideMasterFile = L"notesMaster1.xml"; + strSlideMasterFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; + + strSlideMasterRelsFile = L"notesMaster1.xml.rels"; + strSlideMasterRelsFile = strPptDirectory + _T("notesMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; + } + else if (pTheme->m_eType == typeHandoutMaster) + { + oWriter.WriteString(std::wstring(L"")); + + strSlideMasterFile = L"handoutMaster1.xml"; + strSlideMasterFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + strSlideMasterFile; + + strSlideMasterRelsFile = L"handoutMaster1.xml.rels"; + strSlideMasterRelsFile = strPptDirectory + _T("handoutMasters") + FILE_SEPARATOR_STR + _T("_rels") + FILE_SEPARATOR_STR + strSlideMasterRelsFile; + } + oFile.CreateFile(strSlideMasterFile); + std::wstring strMaster = oWriter.GetData(); + oFile.WriteStringUTF8(strMaster); + oFile.CloseFile(); + + oRels.CloseRels(); + oRels.SaveRels(strSlideMasterRelsFile); + + nStartLayout += nCountLayouts; + nIndexTheme++; +} + +void PPT_FORMAT::CPPTXWriter::WriteColorScheme(CStringWriter& oStringWriter, const std::wstring & name, const std::vector & colors, bool extra) +{ + if (colors.size() < 1) + { + oStringWriter.WriteString(L"\ + \ + \ + \ + \ + "); + return; + } + + if (extra) + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + + oStringWriter.WriteString(L""); + if (extra) + { + oStringWriter.WriteString(L""); + oStringWriter.WriteString(L""); + } +} + +void PPT_FORMAT::CPPTXWriter::WriteBackground(CStringWriter& oWriter, CRelsGenerator& oRels, CBrush& oBackground) +{ + oWriter.WriteString(std::wstring(L"")); + + m_pShapeWriter->SetRelsGenerator(&oRels); + { + oWriter.WriteString(m_pShapeWriter->ConvertBrush(oBackground)); + } + oWriter.WriteString(std::wstring(L"")); +} +void PPT_FORMAT::CPPTXWriter::WriteGroup(CStringWriter& oWriter, CRelsGenerator& oRels, CElementPtr pElement, CLayout* pLayout) +{ + CGroupElement *pGroupElement = dynamic_cast(pElement.get()); + + m_pShapeWriter->SetElement(pElement); + oWriter.WriteString(m_pShapeWriter->ConvertGroup()); + + for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); i++) + { + WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i], pLayout); + } + oWriter.WriteString(L""); +} +void PPT_FORMAT::CPPTXWriter::WriteTable(CStringWriter& oWriter, CRelsGenerator& oRels, CElementPtr pElement, CLayout* pLayout) +{ + CGroupElement *pGroupElement = dynamic_cast(pElement.get()); + + m_pShapeWriter->SetElement(pElement); + oWriter.WriteString(m_pShapeWriter->ConvertTable()); + + oWriter.WriteString(m_pShapeWriter->ConvertTableCells()); + // for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); i++) + // { + // WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i], pLayout); + // } + oWriter.WriteString(L""); +} +void PPT_FORMAT::CPPTXWriter::WriteElement(CStringWriter& oWriter, CRelsGenerator& oRels, CElementPtr pElement, CLayout* pLayout) +{ + if (!pElement) return; + + CGroupElement *pGroupElement = dynamic_cast(pElement.get()); + + if (pGroupElement && pGroupElement->m_sName.find(L"Table") != -1) + return WriteTable(oWriter, oRels, pElement, pLayout); + if (pGroupElement) + { + return WriteGroup(oWriter, oRels, pElement, pLayout); + } + + bool bObject = m_pShapeWriter->SetElement(pElement); + + if (bObject) + { + m_pShapeWriter->SetRelsGenerator(&oRels); + + if (NULL != pLayout) + { + if (-1 != pElement->m_lPlaceholderType) + { + size_t nCountElements = pLayout->m_arElements.size(); + for (size_t nIndex = 0; nIndex < nCountElements; ++nIndex) + { + if ((pElement->m_lPlaceholderType == pLayout->m_arElements[nIndex]->m_lPlaceholderType) && + (pElement->m_lPlaceholderID == pLayout->m_arElements[nIndex]->m_lPlaceholderID)) + { + CElementPtr pElLayout = pLayout->m_arElements[nIndex]; + + bool bIsEqualTransform = ((pElement->m_dRotate == pElLayout->m_dRotate) + && (pElement->m_bFlipH == pElLayout->m_bFlipH) && (pElement->m_bFlipV == pElLayout->m_bFlipV)); + + if (bIsEqualTransform) + { + if (pElement->m_bAnchorEnabled == pElLayout->m_bAnchorEnabled && pElLayout->m_bAnchorEnabled == true) + { + if (pElement->m_rcAnchor.IsEqual(pElLayout->m_rcAnchor, 0.5)) + pElement->m_bAnchorEnabled = false; + } + if (pElement->m_bChildAnchorEnabled == pElLayout->m_bChildAnchorEnabled && pElLayout->m_bChildAnchorEnabled == true) + { + if (pElement->m_rcChildAnchor.IsEqual(pElLayout->m_rcChildAnchor, 0.5)) + pElement->m_bChildAnchorEnabled = false; + } + } + + break; + } + } + } + } + oWriter.WriteString(m_pShapeWriter->ConvertShape()); + } +} + +void PPT_FORMAT::CPPTXWriter::WriteLayout(CLayoutPtr pLayout, int nIndexLayout, int nStartLayout, int nIndexTheme) +{ + if (!pLayout) return; + + CStringWriter oWriter; + + CRelsGenerator oRels(&m_oManager); + oRels.StartLayout(nIndexTheme); + + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"m_strLayoutType + _T("\"")); + oWriter.WriteString(std::wstring(L" showMasterSp=\"") + (pLayout->m_bShowMasterShapes ? _T("1") : _T("0"))); + oWriter.WriteString(std::wstring(L"\" preserve=\"1\">m_sName.empty() == false) + oWriter.WriteString(std::wstring(L" name=\"") + pLayout->m_sName + std::wstring(L"\"")); + oWriter.WriteString(std::wstring(L">")); + + if (pLayout->m_bIsBackground) + { + WriteBackground(oWriter, oRels, pLayout->m_oBackground); + } + + std::wstring strElems = _T("\ + "); + oWriter.WriteString(strElems); + + size_t start_index = 0; + + if (pLayout->m_bIsTitleMaster) + { + CGroupElement *pGroupElement = (!pLayout->m_arElements.empty()) ? dynamic_cast(pLayout->m_arElements[0].get()) : NULL; + + if (pGroupElement) + { + for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) + { + WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); + } + + start_index = 1; + } + } + + for (size_t i = start_index; i < pLayout->m_arElements.size(); ++i) + { + WriteElement(oWriter, oRels, pLayout->m_arElements[i]); + } + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + oWriter.WriteString(std::wstring(L"")); + + oRels.CloseRels(); + + std::wstring strXml = oWriter.GetData(); + std::wstring strFile = L"slideLayout" + std::to_wstring(nIndexLayout + nStartLayout + 1) + L".xml"; + + CFile oFile; + std::wstring strFileLayoutPath= m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("slideLayouts") + FILE_SEPARATOR_STR; + oFile.CreateFile(strFileLayoutPath + strFile); + oFile.WriteStringUTF8(strXml); + oFile.CloseFile(); + + strFile = L"slideLayout" + std::to_wstring(nIndexLayout + nStartLayout + 1) + L".xml.rels"; + oRels.SaveRels(strFileLayoutPath + _T("_rels") + FILE_SEPARATOR_STR + strFile); +} +void PPT_FORMAT::CPPTXWriter::WriteSlide(int nIndexSlide) +{ + CStringWriter oWriter; + CRelsGenerator oRels(&m_oManager); + + CSlide* pSlide = m_pDocument->m_arSlides[nIndexSlide]; + + if (0 == pSlide->m_lThemeID) + oRels.StartSlide(pSlide->m_lLayoutID, pSlide->m_lNotesID); + else + { + int nLayout = pSlide->m_lLayoutID; + for (int i = 0; i < pSlide->m_lThemeID; ++i) + { + nLayout += (int)m_pDocument->m_arThemes[i]->m_arLayouts.size(); + } + + oRels.StartSlide(nLayout, pSlide->m_lNotesID); + } + + oWriter.WriteString(std::wstring(L"")); + oWriter.WriteString(std::wstring(L"m_bShowMasterShapes) + oWriter.WriteString(std::wstring(L" showMasterSp=\"0\"")); + oWriter.WriteString(std::wstring(L">")); + + oWriter.WriteString(std::wstring(L"m_sName.empty() == false) + oWriter.WriteString(std::wstring(L" name=\"") + pSlide->m_sName + std::wstring(L"\"")); + + oWriter.WriteString(std::wstring(L">")); + + if (pSlide->m_bIsBackground) + { + WriteBackground(oWriter, oRels, pSlide->m_oBackground); + } + + oWriter.WriteString(std::wstring(L"\ + ")); + + CGroupElement *pGroupElement = !pSlide->m_arElements.empty() ? dynamic_cast(pSlide->m_arElements[0].get()) : NULL; + + size_t start_index = 0; + + if (pGroupElement) + { + for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) + { + WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); + } + + start_index = 1; + } + + for (size_t i = start_index; i < pSlide->m_arElements.size(); ++i) + { + WriteElement(oWriter, oRels, pSlide->m_arElements[i]); + } + + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + + WriteTransition(oWriter, pSlide->m_oSlideShow); + + // TODO write new method and class for timing + WriteTiming(oWriter, oRels, nIndexSlide); + + + oWriter.WriteString(std::wstring(L"")); + + + + + oRels.CloseRels(); + + std::wstring strXml = oWriter.GetData(); + std::wstring strFile = L"slide" + std::to_wstring(nIndexSlide + 1) + L".xml"; + std::wstring strFileSlidePath= m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("slides") + FILE_SEPARATOR_STR; + + CFile oFile; + oFile.CreateFile(strFileSlidePath + strFile); + oFile.WriteStringUTF8(strXml); + oFile.CloseFile(); + + strFile = L"slide" + std::to_wstring(nIndexSlide + 1) + L".xml.rels"; + oRels.SaveRels(strFileSlidePath + _T("_rels") + FILE_SEPARATOR_STR + strFile); +} + +void PPT_FORMAT::CPPTXWriter::WriteTransition(CStringWriter& oWriter, CSlideShowInfo &oSSInfo) +{ + CTransition& transition = oSSInfo.m_oTransition; + PPTX::Logic::Transition Tr; + + std::wstring param_name, param_value; + std::wstring param_name2, param_value2; + + switch(transition.m_nEffectType) + { + case 1: + case 17: + case 18: + case 19: + case 22: + case 23: + case 27: + { + auto pTrBase = new PPTX::Logic::EmptyTransition(); + switch (transition.m_nEffectType) + { + case 1: pTrBase->name = L"random"; break; + case 17: pTrBase->name = L"diamond"; break; + case 18: pTrBase->name = L"plus"; break; + case 19: pTrBase->name = L"wedge"; break; + case 22: pTrBase->name = L"newsflash"; break; + case 23: pTrBase->name = L"fade"; break; + case 27: pTrBase->name = L"circle"; break; + } + Tr.base.base.reset(pTrBase); + }break; + case 2: + case 3: + case 8: + case 21: + { + auto pTrBase = new PPTX::Logic::OrientationTransition; + switch (transition.m_nEffectType) + { + case 2: pTrBase->name = L"blinds"; break; + case 3: pTrBase->name = L"checker"; break; + case 8: pTrBase->name = L"randomBar"; break; + case 21: pTrBase->name = L"comb"; break; + } + pTrBase->dir = new PPTX::Limit::Orient; + pTrBase->dir->SetBYTECode(transition.m_nEffectDirection); + Tr.base.base.reset(pTrBase); + }break; + case 0: + case 5: + case 6: + { + auto pTrBase = new PPTX::Logic::OptionalBlackTransition; + if (transition.m_nEffectType == 0) pTrBase->name = L"cut"; + else if (transition.m_nEffectType == 5) pTrBase->name = L"dissolve"; + else if (transition.m_nEffectType == 6) pTrBase->name = L"fade"; + pTrBase->thruBlk = transition.m_nEffectDirection; + Tr.base.base.reset(pTrBase); + }break; + case 4: + case 7: + { + auto pTrBase = new PPTX::Logic::EightDirectionTransition; + if (transition.m_nEffectType == 4) pTrBase->name = L"cover"; + else if (transition.m_nEffectType == 7) pTrBase->name = L"pull"; + + pTrBase->dir = new PPTX::Limit::EightDirectionVal; + switch(transition.m_nEffectDirection) + { + case 0: param_value = L"r"; break; + case 1: param_value = L"b"; break; + case 2: param_value = L"l"; break; + case 3: param_value = L"t"; break; + case 4: param_value = L"br"; break; + case 5: param_value = L"bl"; break; + case 6: param_value = L"tr"; break; + case 7: param_value = L"tl"; break; + } + pTrBase->dir->set(param_value); + Tr.base.base.reset(pTrBase); + }break; + case 9: + { + + auto pTrBase = new PPTX::Logic::CornerDirectionTransition; + pTrBase->name = L"strips"; + pTrBase->dir = new PPTX::Limit::CornerDirectionVal; + switch(transition.m_nEffectDirection) + { + case 0: param_value = L"ru"; break; + case 1: param_value = L"lu"; break; + case 2: param_value = L"rd"; break; + case 3: param_value = L"ld"; break; + } + pTrBase->dir->set(param_value); + Tr.base.base.reset(pTrBase); + }break; + case 10: + case 20: + { + auto pTrBase = new PPTX::Logic::SideDirectionTransition; + if (transition.m_nEffectType == 10) pTrBase->name = L"wipe"; + if (transition.m_nEffectType == 20) pTrBase->name = L"push"; + + pTrBase->dir = new PPTX::Limit::SideDirectionVal; + switch(transition.m_nEffectDirection) + { + case 0: param_value = L"l"; break; + case 1: param_value = L"u"; break; + case 2: param_value = L"r"; break; + case 3: param_value = L"d"; break; + } + pTrBase->dir->set(param_value); + Tr.base.base.reset(pTrBase); + }break; + case 11: + { + auto pTrBase = new PPTX::Logic::ZoomTransition; + pTrBase->dir = new PPTX::Limit::InOutDirectionVal; + pTrBase->dir->SetBYTECode(!transition.m_nEffectDirection); + Tr.base.base.reset(pTrBase); + }break; + case 13: + { + auto pTrBase = new PPTX::Logic::SplitTransition; + pTrBase->dir = new PPTX::Limit::InOutDirectionVal; + pTrBase->orient = new PPTX::Limit::Orient; + + switch(transition.m_nEffectDirection) + { + case 0: param_value2 = L"horz"; param_value = L"out"; break; + case 1: param_value2 = L"horz"; param_value = L"in"; break; + case 2: param_value2 = L"vert"; param_value = L"out"; break; + case 3: param_value2 = L"vert"; param_value = L"in"; break; + } + pTrBase->dir->set(param_value); + pTrBase->orient->set(param_value2); + + Tr.base.base.reset(pTrBase); + }break; + case 26: + { + auto pTrBase = new PPTX::Logic::WheelTransition; + pTrBase->spokes = transition.m_nEffectDirection; + Tr.base.base.reset(pTrBase); + }break; + default: + break; + } + + Tr.spd = new PPTX::Limit::TransitionSpeed; + // "2 -" переворот числа + Tr.spd->SetBYTECode(2 - transition.m_nSpeed); + + Tr.advClick = oSSInfo.m_bManulClick; + + if (oSSInfo.m_bAdvClick && + oSSInfo.m_dSlideDuration >= 0 && + oSSInfo.m_dSlideDuration <= 86399000) + { + Tr.advTm = oSSInfo.m_dSlideDuration; + } + if (transition.m_bAudioPresent) + { + bool bExternal = false; + std::wstring rId = m_pShapeWriter->m_pRels->WriteAudio(transition.m_oAudio.m_strAudioFileName, bExternal); + Tr.sndAc = new PPTX::Logic::SndAc; + Tr.sndAc->stSnd = new PPTX::Logic::StSnd; + Tr.sndAc->stSnd->name = XmlUtils::EncodeXmlString(transition.m_oAudio.m_sImageName); + Tr.sndAc->stSnd->embed = rId; + } + oWriter.WriteString(Tr.toXML()); +} + +void PPT_FORMAT::CPPTXWriter::WriteNotes(int nIndexNotes) +{ + CStringWriter oWriter; + CRelsGenerator oRels(&m_oManager); + + CSlide* pNotes = m_pDocument->m_arNotes[nIndexNotes]; + + oRels.StartNotes(pNotes->m_lSlideID, m_pDocument->m_pNotesMaster != NULL); + + oWriter.WriteString(std::wstring(L"")); + oWriter.WriteString(std::wstring(L"m_bShowMasterShapes) + oWriter.WriteString(std::wstring(L" showMasterSp=\"0\"")); + oWriter.WriteString(std::wstring(L">")); + + oWriter.WriteString(std::wstring(L"")); + + if (pNotes->m_bIsBackground) + { + WriteBackground(oWriter, oRels, pNotes->m_oBackground); + } + + oWriter.WriteString(std::wstring(L"\ + ")); + + CGroupElement *pGroupElement = !pNotes->m_arElements.empty() ? dynamic_cast(pNotes->m_arElements[0].get()) : NULL; + + size_t start_index = 0; + + if (pGroupElement) + { + for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i) + { + WriteElement(oWriter, oRels, pGroupElement->m_pChildElements[i]); + } + + start_index = 1; + } + + for (size_t i = start_index; i < pNotes->m_arElements.size(); ++i) + { + WriteElement(oWriter, oRels, pNotes->m_arElements[i]); + } + + oWriter.WriteString(std::wstring(L"")); + + oWriter.WriteString(std::wstring(L"")); + oWriter.WriteString(std::wstring(L"")); + + oRels.CloseRels(); + + std::wstring strXml = oWriter.GetData(); + std::wstring strFile = L"notesSlide" + std::to_wstring(nIndexNotes + 1) + L".xml"; + std::wstring strFileSlidePath = m_strTempDirectory + FILE_SEPARATOR_STR + _T("ppt") + FILE_SEPARATOR_STR + _T("notesSlides") + FILE_SEPARATOR_STR; + + CFile oFile; + oFile.CreateFile(strFileSlidePath + strFile); + oFile.WriteStringUTF8(strXml); + oFile.CloseFile(); + + strFile = L"notesSlide" + std::to_wstring(nIndexNotes + 1) + L".xml.rels"; + oRels.SaveRels(strFileSlidePath + _T("_rels") + FILE_SEPARATOR_STR + strFile); +} + +void PPT_FORMAT::CPPTXWriter::WriteSlides() +{ + m_oManager.WriteAudioCollection(m_pUserInfo->m_oExMedia.m_arAudioCollection); + for (size_t nIndexS = 0; nIndexS < m_pDocument->m_arSlides.size(); ++nIndexS) + { + WriteSlide((int)nIndexS); + } +} +void PPT_FORMAT::CPPTXWriter::WriteNotes() +{ + for (size_t nIndexS = 0; nIndexS < m_pDocument->m_arNotes.size(); ++nIndexS) + { + WriteNotes((int)nIndexS); + } +} + + +void PPT_FORMAT::CPPTXWriter::WriteTiming(CStringWriter& oWriter, CRelsGenerator &oRels, int nIndexSlide) +{ + PPTX::Logic::Timing oTiming; + + auto slide_iter = m_pUserInfo->m_mapSlides.find(m_pUserInfo->m_arrSlidesOrder[nIndexSlide]); + // This part for new animation + CRecordSlideProgTagsContainer* progTag = slide_iter->second->m_pSlideProgTagsContainer; + CRecordPP10SlideBinaryTagExtension* pPP10SlideBinaryTag = progTag ? progTag->getPP10SlideBinaryTagExtension() : NULL; + // This part for old animation + std::vector arrShapeCont; + slide_iter->second->GetRecordsByType(&arrShapeCont, true); + std::vector arrOldAnim; + for (auto ShapeCont : arrShapeCont) + { + SOldAnimation oldAnim; + std::vector shape; + ShapeCont->GetRecordsByType(&shape, true); + std::vector anim; + ShapeCont->GetRecordsByType(&anim, true); + if (!anim.empty() && !shape.empty()) + { + oldAnim.shapeId = shape[0]->m_nID; + oldAnim.anim = anim[0]; + arrOldAnim.push_back(oldAnim); + } + } + + if (!pPP10SlideBinaryTag && arrOldAnim.empty()) + return; + + Animation animation(pPP10SlideBinaryTag, arrOldAnim, &(m_pUserInfo->m_oExMedia), &oRels); + + animation.Convert(oTiming); + oWriter.WriteString(oTiming.toXML()); + //oWriter.WriteString(std::wstring(L"")); + +} diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h index 9152546f58..a908185bbb 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.h @@ -76,7 +76,8 @@ namespace PPT_FORMAT void WriteAll (); void WriteThemes (); void WriteTheme (CThemePtr pTheme, int & nIndexTheme, int & nStartLayout); - void WriteSlides (); + void WriteTheme (CRecordRoundTripThemeAtom *pTheme, int &nIndexTheme); + void WriteSlides (); void WriteNotes (); void WriteLayout (CLayoutPtr pLayout, int nIndexLayout, int nStartLayout, int nIndexTheme); void WriteSlide (int nIndexSlide); diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ImageManager.h b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ImageManager.h index 51757839de..d16b609857 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ImageManager.h +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ImageManager.h @@ -281,30 +281,55 @@ namespace PPT_FORMAT std::wstring strMem = m_oWriter.GetData(); oFile.WriteStringUTF8(strMem); oFile.CloseFile(); - } - inline std::wstring WriteHyperlink(const std::wstring& strHyperlink) - { - std::map::iterator pPair = m_mapHyperlinks.find(strHyperlink); + } + inline std::wstring WriteHyperlink(const std::wstring& strHyperlink, bool isExternal = false) + { + std::map::iterator pPair = m_mapHyperlinks.find(strHyperlink); - if (m_mapHyperlinks.end() != pPair) - { + if (m_mapHyperlinks.end() != pPair) + { std::wstring strRid = L"rId" + pPair->second; - return strRid; - } - m_mapHyperlinks[strHyperlink] = m_lNextRelsID; + return strRid; + } + m_mapHyperlinks[strHyperlink] = m_lNextRelsID; std::wstring strRid = L"rId" + std::to_wstring( m_lNextRelsID++); - std::wstring strRels = L""; + strRels += strHyperlink; + strRels += (isExternal ? L"\" TargetMode=\"External\" />" : L"\"/>"); + + m_oWriter.WriteString(strRels); - m_oWriter.WriteString(strRels); - return strRid; } + inline std::wstring WriteFile(const std::wstring& strPath) + { + std::map::iterator pPair = m_mapHyperlinks.find(strPath); + + if (m_mapHyperlinks.end() != pPair) + { + std::wstring strRid = L"rId" + pPair->second; + return strRid; + } + m_mapHyperlinks[strPath] = m_lNextRelsID; + + std::wstring strRid = L"rId" + std::to_wstring( m_lNextRelsID++); + + std::wstring strRels = L""; + + m_oWriter.WriteString(strRels); + + return strRid; + } + + inline std::wstring WriteHyperlinkMedia(const std::wstring& strMedia, bool bExternal = true, bool newRIdAlways = false, std::wstring strRelsType = L"http://schemas.microsoft.com/office/2007/relationships/media") { if (!newRIdAlways) @@ -361,11 +386,10 @@ namespace PPT_FORMAT } std::wstring WriteSlideRef(const std::wstring& strLocation) { + int sldNum = CExFilesInfo::GetSlideNumber(strLocation); + std::wstring strSlide(L"slide"); - std::vector strs; - boost::split(strs, strLocation, boost::is_any_of(L",")); - if (strs.size() == 3) - strSlide += strs[1]; + strSlide += std::to_wstring(sldNum); strSlide += L".xml"; return WriteHyperlinkMedia(strSlide, false, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide"); } diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.cpp b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.cpp index 0cfdaf0e83..b5e791349f 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.cpp @@ -48,766 +48,763 @@ CStylesWriter::CStylesWriter(PPT_FORMAT::CTheme* pTheme) : m_pTheme(pTheme) {} void CStylesWriter::ConvertStyleLevel(PPT_FORMAT::CTextStyleLevel& oLevel, PPT_FORMAT::CStringWriter& oWriter, const int& nLevel) {//дублирование CTextPFRun и CTextCFRun с ShapeWriter - todooo - вынести отдельно std::wstring str1; - if (nLevel == 9) - str1 = _T("textDirection.is_init()) - { - if (pPF->textDirection.get() == 1) oWriter.WriteString(L" rtl=\"1\""); - else oWriter.WriteString(L" rtl=\"0\""); - } - if (pPF->fontAlign.is_init()) - { - std::wstring strProp = GetFontAlign(pPF->fontAlign.get()); - oWriter.WriteString(L" fontAlgn=\"" + strProp + L"\""); - } + if (pPF->textDirection.is_init()) + { + if (pPF->textDirection.get() == 1) oWriter.WriteString(L" rtl=\"1\""); + else oWriter.WriteString(L" rtl=\"0\""); + } + if (pPF->fontAlign.is_init()) + { + std::wstring strProp = GetFontAlign(pPF->fontAlign.get()); + oWriter.WriteString(L" fontAlgn=\"" + strProp + L"\""); + } - int leftMargin = 0; - if (pPF->leftMargin.is_init()) - { - leftMargin = pPF->leftMargin.get(); - std::wstring strProp = std::to_wstring(leftMargin); - oWriter.WriteString(L" marL=\"" + strProp + L"\""); - } - if (pPF->indent.is_init()) - { - std::wstring strProp = std::to_wstring(pPF->indent.get() - leftMargin); - oWriter.WriteString(L" indent=\"" + strProp + L"\""); - } - if (pPF->textAlignment.is_init()) - { - std::wstring strProp = GetTextAlign(pPF->textAlignment.get()); - oWriter.WriteString(L" algn=\"" + strProp + L"\""); - } - if (pPF->defaultTabSize.is_init()) - { + int leftMargin = 0; + if (pPF->leftMargin.is_init()) + { + leftMargin = pPF->leftMargin.get(); + std::wstring strProp = std::to_wstring(leftMargin); + oWriter.WriteString(L" marL=\"" + strProp + L"\""); + } + if (pPF->indent.is_init()) + { + std::wstring strProp = std::to_wstring(pPF->indent.get() - leftMargin); + oWriter.WriteString(L" indent=\"" + strProp + L"\""); + } + if (pPF->textAlignment.is_init()) + { + std::wstring strProp = GetTextAlign(pPF->textAlignment.get()); + oWriter.WriteString(L" algn=\"" + strProp + L"\""); + } + if (pPF->defaultTabSize.is_init()) + { std::wstring strProp = std::to_wstring(pPF->defaultTabSize.get()); - oWriter.WriteString(L" defTabSz=\"" + strProp + L"\""); - } - oWriter.WriteString(L">"); + oWriter.WriteString(L" defTabSz=\"" + strProp + L"\""); + } + oWriter.WriteString(L">"); - if (pPF->tabStops.size() > 0) - { - oWriter.WriteString(L""); - for (size_t t = 0 ; t < pPF->tabStops.size(); t++) - { - std::wstring strTabPos = std::to_wstring(pPF->tabStops[t].first); - oWriter.WriteString(L"tabStops.size() > 0) + { + oWriter.WriteString(L""); + for (size_t t = 0 ; t < pPF->tabStops.size(); t++) + { + std::wstring strTabPos = std::to_wstring(pPF->tabStops[t].first); + oWriter.WriteString(L"tabStops[t].second == 1) oWriter.WriteString(L" algn=\"ctr\"/>"); - else if (pPF->tabStops[t].second == 2) oWriter.WriteString(L" algn=\"r\"/>"); - else if (pPF->tabStops[t].second == 3) oWriter.WriteString(L" algn=\"dec\"/>"); - else oWriter.WriteString(L" algn=\"l\"/>"); - } - oWriter.WriteString(L""); - } + if (pPF->tabStops[t].second == 1) oWriter.WriteString(L" algn=\"ctr\"/>"); + else if (pPF->tabStops[t].second == 2) oWriter.WriteString(L" algn=\"r\"/>"); + else if (pPF->tabStops[t].second == 3) oWriter.WriteString(L" algn=\"dec\"/>"); + else oWriter.WriteString(L" algn=\"l\"/>"); + } + oWriter.WriteString(L""); + } - if (pPF->hasBullet.is_init()) - { - if (pPF->hasBullet.get()) - { - if (pPF->bulletColor.is_init()) - { - oWriter.WriteString(L""); - oWriter.WriteString(PPT_FORMAT::CShapeWriter::ConvertColor(pPF->bulletColor.get(), 255)); - oWriter.WriteString(L""); - } - if (pPF->bulletSize.is_init()) - { - if (pPF->bulletSize.get() > 24 && pPF->bulletSize.get() < 401) - { - std::wstring strProp = std::to_wstring(pPF->bulletSize.get() * 1000 ); - oWriter.WriteString(L""); - } - if (pPF->bulletSize.get() < 0 && pPF->bulletSize.get() > -4001) - { - std::wstring strProp = std::to_wstring(- pPF->bulletSize.get() ); - oWriter.WriteString(L""); - } - } - if (pPF->bulletFontProperties.is_init()) - { - oWriter.WriteString(L"bulletFontProperties->Name + L"\""); + if (pPF->hasBullet.is_init()) + { + if (pPF->hasBullet.get()) + { + if (pPF->bulletColor.is_init()) + { + oWriter.WriteString(L""); + oWriter.WriteString(PPT_FORMAT::CShapeWriter::ConvertColor(pPF->bulletColor.get(), 255)); + oWriter.WriteString(L""); + } + if (pPF->bulletSize.is_init()) + { + if (pPF->bulletSize.get() > 24 && pPF->bulletSize.get() < 401) + { + std::wstring strProp = std::to_wstring(pPF->bulletSize.get() * 1000 ); + oWriter.WriteString(L""); + } + if (pPF->bulletSize.get() < 0 && pPF->bulletSize.get() > -4001) + { + std::wstring strProp = std::to_wstring(- pPF->bulletSize.get() ); + oWriter.WriteString(L""); + } + } + if (pPF->bulletFontProperties.is_init()) + { + oWriter.WriteString(L"bulletFontProperties->Name + L"\""); - if ( pPF->bulletFontProperties->PitchFamily > 0) - { - oWriter.WriteString(std::wstring(L" pitchFamily=\"") + std::to_wstring(pPF->bulletFontProperties->PitchFamily) + L"\""); - } - if ( pPF->bulletFontProperties->Charset > 0) - { - oWriter.WriteString(std::wstring(L" charset=\"") + std::to_wstring((char)pPF->bulletFontProperties->Charset) + L"\""); - } - oWriter.WriteString(std::wstring(L"/>")); + if ( pPF->bulletFontProperties->PitchFamily > 0) + { + oWriter.WriteString(std::wstring(L" pitchFamily=\"") + std::to_wstring(pPF->bulletFontProperties->PitchFamily) + L"\""); + } + if ( pPF->bulletFontProperties->Charset > 0) + { + oWriter.WriteString(std::wstring(L" charset=\"") + std::to_wstring((char)pPF->bulletFontProperties->Charset) + L"\""); + } + oWriter.WriteString(std::wstring(L"/>")); - } - if (pPF->bulletChar.is_init()) - { - wchar_t bu = pPF->bulletChar.get(); - - oWriter.WriteString(L""); - } -// if (!pPF->bulletAutoNum.is_init()) -// { -// oWriter.WriteString(L""); -// } - } - else - { - oWriter.WriteString(L""); - } - } + } + if (pPF->bulletChar.is_init()) + { + wchar_t bu = pPF->bulletChar.get(); - double dKoef1 = 3.52777778; - if (pPF->lineSpacing.is_init()) - { + oWriter.WriteString(L""); + } + // if (!pPF->bulletAutoNum.is_init()) + // { + // oWriter.WriteString(L""); + // } + } + else + { + oWriter.WriteString(L""); + } + } + + double dKoef1 = 3.52777778; + if (pPF->lineSpacing.is_init()) + { LONG val = pPF->lineSpacing.get(); - if (val > 0) - { - std::wstring str = std::to_wstring( (int)(val * 0.125 * 100/*/ dKoef1*/)); - oWriter.WriteString(L""); - } - else if (val < 0 && val > -13200) - { - std::wstring str = std::to_wstring(-val * 1000); - oWriter.WriteString(L""); - } - } - if (pPF->spaceAfter.is_init()) - { + if (val > 0) + { + std::wstring str = std::to_wstring( (int)(val * 0.125 * 100/*/ dKoef1*/)); + oWriter.WriteString(L""); + } + else if (val < 0 && val > -13200) + { + std::wstring str = std::to_wstring(-val * 1000); + oWriter.WriteString(L""); + } + } + if (pPF->spaceAfter.is_init()) + { LONG val = pPF->spaceAfter.get(); - if (val > 0) - { - std::wstring str = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); - oWriter.WriteString(L""); - } - else if (val < 0 && val > -13200) - { - std::wstring str = std::to_wstring(-val * 1000); - oWriter.WriteString(L""); - } - } - if (pPF->spaceBefore.is_init()) - { + if (val > 0) + { + std::wstring str = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); + oWriter.WriteString(L""); + } + else if (val < 0 && val > -13200) + { + std::wstring str = std::to_wstring(-val * 1000); + oWriter.WriteString(L""); + } + } + if (pPF->spaceBefore.is_init()) + { LONG val = pPF->spaceBefore.get(); - if (val > 0) - { - std::wstring str = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); - oWriter.WriteString(L""); - } - else if (val < 0 && val > -13200) - { - std::wstring str = std::to_wstring(-val * 1000); - oWriter.WriteString(L""); - } - } + if (val > 0) + { + std::wstring str = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); + oWriter.WriteString(L""); + } + else if (val < 0 && val > -13200) + { + std::wstring str = std::to_wstring(-val * 1000); + oWriter.WriteString(L""); + } + } - oWriter.WriteString(L"Size.is_init()) - { - std::wstring str = std::to_wstring((int)(100 * pCF->Size.get())); - oWriter.WriteString(L" sz=\"" + str + L"\""); - } - if (pCF->FontBold.is_init()) - { - if (pCF->FontBold.get()) - oWriter.WriteString(L" b=\"1\""); - else - oWriter.WriteString(L" b=\"0\""); - } - if (pCF->FontItalic.is_init()) - { - if (pCF->FontItalic.get()) - oWriter.WriteString(std::wstring(L" i=\"1\"")); - else - oWriter.WriteString(std::wstring(L" i=\"0\"")); - } - if (pCF->Language.is_init()) - { - std::wstring str_lang = msLCID2wstring(pCF->Language.get()); + PPT_FORMAT::CTextCFRun* pCF = &oLevel.m_oCFRun; - if (str_lang.length() > 0) - oWriter.WriteString(std::wstring(L" lang=\"") + str_lang + _T("\"")); - } - oWriter.WriteString(std::wstring(L">")); + if (pCF->Size.is_init()) + { + std::wstring str = std::to_wstring((int)(100 * pCF->Size.get())); + oWriter.WriteString(L" sz=\"" + str + L"\""); + } + if (pCF->FontBold.is_init()) + { + if (pCF->FontBold.get()) + oWriter.WriteString(L" b=\"1\""); + else + oWriter.WriteString(L" b=\"0\""); + } + if (pCF->FontItalic.is_init()) + { + if (pCF->FontItalic.get()) + oWriter.WriteString(std::wstring(L" i=\"1\"")); + else + oWriter.WriteString(std::wstring(L" i=\"0\"")); + } + if (pCF->Language.is_init()) + { + std::wstring str_lang = msLCID2wstring(pCF->Language.get()); - if (pCF->Color.is_init()) - { - if (pCF->Color->m_lSchemeIndex != -1) - { - oWriter.WriteString(L"Color->m_lSchemeIndex) + L"\"/>"); - } - else - { + if (str_lang.length() > 0) + oWriter.WriteString(std::wstring(L" lang=\"") + str_lang + _T("\"")); + } + oWriter.WriteString(std::wstring(L">")); + + if (pCF->Color.is_init()) + { + if (pCF->Color->m_lSchemeIndex != -1) + { + oWriter.WriteString(L"Color->m_lSchemeIndex) + L"\"/>"); + } + else + { std::wstring strColor = XmlUtils::IntToString(pCF->Color->GetLONG_RGB(), L"%06x"); - oWriter.WriteString(L""); - } - } - if ((pCF->font.ansi.is_init()) && (!pCF->font.ansi->Name.empty())) - { - oWriter.WriteString(L"font.ansi->Name + L"\"/>"); - } - else if (pCF->fontRef.is_init()) - { - if ((m_pTheme) && (pCF->fontRef.get() < m_pTheme->m_arFonts.size())) - { - oWriter.WriteString(L"m_arFonts[pCF->fontRef.get()].Name + L"\"/>"); - } - else - { - if (0 == pCF->fontRef.get()) - { - oWriter.WriteString(L""); - } - else - { - oWriter.WriteString(L""); - } - } - } - if (pCF->font.ea.is_init()) - { - oWriter.WriteString(L"font.ea->Name + L"\"/>"); - } - if (pCF->font.sym.is_init()) - { - oWriter.WriteString(L"font.sym->Name + L"\"/>"); - } - oWriter.WriteString(L""); + oWriter.WriteString(L""); + } + } + if ((pCF->font.ansi.is_init()) && (!pCF->font.ansi->Name.empty())) + { + oWriter.WriteString(L"font.ansi->Name + L"\"/>"); + } + else if (pCF->fontRef.is_init()) + { + if ((m_pTheme) && (pCF->fontRef.get() < m_pTheme->m_arFonts.size())) + { + oWriter.WriteString(L"m_arFonts[pCF->fontRef.get()].Name + L"\"/>"); + } + else + { + if (0 == pCF->fontRef.get()) + { + oWriter.WriteString(L""); + } + else + { + oWriter.WriteString(L""); + } + } + } + if (pCF->font.ea.is_init()) + { + oWriter.WriteString(L"font.ea->Name + L"\"/>"); + } + if (pCF->font.sym.is_init()) + { + oWriter.WriteString(L"font.sym->Name + L"\"/>"); + } + oWriter.WriteString(L""); std::wstring str3; - if (nLevel == 9) - str3 = L""; - else - str3 = L""; + if (nLevel == 9) + str3 = L""; + else + str3 = L""; - oWriter.WriteString(str3); + oWriter.WriteString(str3); } PPT_FORMAT::CShapeWriter::CShapeWriter() { - m_pTheme = NULL; - m_pRels = NULL; - m_lNextShapeID = 1000; + m_pTheme = NULL; + m_pRels = NULL; + m_lNextShapeID = 1000; - m_bWordArt = false; - m_bTextBox = false; - -////////////////////////////////////////////////////////////////////// - m_dDpiX = 96.0; - m_dDpiY = 96.0; + m_bWordArt = false; + m_bTextBox = false; - m_lClipMode = c_nClipRegionTypeWinding; + ////////////////////////////////////////////////////////////////////// + m_dDpiX = 96.0; + m_dDpiY = 96.0; - m_pSimpleGraphicsConverter = new Aggplus::CGraphicsPathSimpleConverter(); - //m_pSimpleGraphicsConverter->SetRenderer(this); + m_lClipMode = c_nClipRegionTypeWinding; - m_dTransformAngle = 0.0; + m_pSimpleGraphicsConverter = new Aggplus::CGraphicsPathSimpleConverter(); + //m_pSimpleGraphicsConverter->SetRenderer(this); - m_pFontManager = NULL; + m_dTransformAngle = 0.0; + + m_pFontManager = NULL; } bool PPT_FORMAT::CShapeWriter::SetElement(CElementPtr pElem) { - m_pElement = pElem; - - m_pSimpleGraphicsConverter->PathCommandEnd(); + m_pElement = pElem; - m_bWordArt = false; - m_bTextBox = false; + m_pSimpleGraphicsConverter->PathCommandEnd(); - m_xmlGeomAlternative.clear(); - m_xmlTxBodyAlternative.clear(); - m_xmlAlternative.clear(); + m_bWordArt = false; + m_bTextBox = false; - m_oWriter.ClearNoAttack(); - m_oWriterPath.ClearNoAttack(); - m_oWriterVML.ClearNoAttack(); + m_xmlGeomAlternative.clear(); + m_xmlTxBodyAlternative.clear(); + m_xmlAlternative.clear(); - return (m_pElement != NULL); + m_oWriter.ClearNoAttack(); + m_oWriterPath.ClearNoAttack(); + m_oWriterVML.ClearNoAttack(); + + return (m_pElement != NULL); } std::wstring PPT_FORMAT::CShapeWriter::ConvertLine(CPen & pen) { - PPT_FORMAT::CStringWriter line_writer; + PPT_FORMAT::CStringWriter line_writer; - std::wstring strL; - switch(pen.LineStyle) - { - case 1: strL = L" cmpd=\"dbl\""; break; - case 2: strL = L" cmpd=\"thickThin\""; break; - case 3: strL = L" cmpd=\"thinThick\""; break; - case 4: strL = L" cmpd=\"tri\""; break; - } - line_writer.WriteString(L""); + std::wstring strL; + switch(pen.LineStyle) + { + case 1: strL = L" cmpd=\"dbl\""; break; + case 2: strL = L" cmpd=\"thickThin\""; break; + case 3: strL = L" cmpd=\"thinThick\""; break; + case 4: strL = L" cmpd=\"tri\""; break; + } + line_writer.WriteString(L""); - line_writer.WriteString(L""); - line_writer.WriteString(ConvertColor(pen.Color, pen.Alpha)); - line_writer.WriteString(L""); + line_writer.WriteString(L""); + line_writer.WriteString(ConvertColor(pen.Color, pen.Alpha)); + line_writer.WriteString(L""); - switch(pen.DashStyle) - { - case 1: line_writer.WriteString(L""); break; - case 2: line_writer.WriteString(L""); break; - case 3: line_writer.WriteString(L""); break; - case 4: line_writer.WriteString(L""); break; - case 5: line_writer.WriteString(L""); break; - case 6: line_writer.WriteString(L""); break; - case 7: line_writer.WriteString(L""); break; - case 8: line_writer.WriteString(L""); break; - case 9: line_writer.WriteString(L""); break; - case 10:line_writer.WriteString(L""); break; - } - switch(pen.LineJoin) - { - case 0: line_writer.WriteString(L""); break; - case 1: line_writer.WriteString(L""); break; - case 2: line_writer.WriteString(L""); break; - } + switch(pen.DashStyle) + { + case 1: line_writer.WriteString(L""); break; + case 2: line_writer.WriteString(L""); break; + case 3: line_writer.WriteString(L""); break; + case 4: line_writer.WriteString(L""); break; + case 5: line_writer.WriteString(L""); break; + case 6: line_writer.WriteString(L""); break; + case 7: line_writer.WriteString(L""); break; + case 8: line_writer.WriteString(L""); break; + case 9: line_writer.WriteString(L""); break; + case 10:line_writer.WriteString(L""); break; + } + switch(pen.LineJoin) + { + case 0: line_writer.WriteString(L""); break; + case 1: line_writer.WriteString(L""); break; + case 2: line_writer.WriteString(L""); break; + } - line_writer.WriteString(L""); - line_writer.WriteString(L""); - - line_writer.WriteString(L""); + line_writer.WriteString(L""); + line_writer.WriteString(L""); - return line_writer.GetData(); + line_writer.WriteString(L""); + + return line_writer.GetData(); } std::wstring PPT_FORMAT::CShapeWriter::ConvertLineEnd(unsigned char cap, unsigned char length, unsigned char width) { - if (cap < 1) return L""; + if (cap < 1) return L""; - std::wstring sResult; + std::wstring sResult; - switch(cap) - { - case 1: sResult += L" type=\"triangle\""; break; - case 2: sResult += L" type=\"stealth\""; break; - case 3: sResult += L" type=\"diamond\""; break; - case 4: sResult += L" type=\"oval\""; break; - case 5: sResult += L" type=\"arrow\""; break; - } - switch(length) - { - case 0: sResult += L" len=\"sm\""; break; - case 1: sResult += L" len=\"med\""; break; - case 2: sResult += L" len=\"lg\""; break; - } - switch(width) - { - case 0: sResult += L" w=\"sm\""; break; - case 1: sResult += L" w=\"med\""; break; - case 2: sResult += L" w=\"lg\""; break; - } - return sResult; + switch(cap) + { + case 1: sResult += L" type=\"triangle\""; break; + case 2: sResult += L" type=\"stealth\""; break; + case 3: sResult += L" type=\"diamond\""; break; + case 4: sResult += L" type=\"oval\""; break; + case 5: sResult += L" type=\"arrow\""; break; + } + switch(length) + { + case 0: sResult += L" len=\"sm\""; break; + case 1: sResult += L" len=\"med\""; break; + case 2: sResult += L" len=\"lg\""; break; + } + switch(width) + { + case 0: sResult += L" w=\"sm\""; break; + case 1: sResult += L" w=\"med\""; break; + case 2: sResult += L" w=\"lg\""; break; + } + return sResult; } std::wstring PPT_FORMAT::CShapeWriter::ConvertBrush(CBrush & brush) { - PPT_FORMAT::CStringWriter brush_writer; - - if (brush.Type == c_BrushTypeTexture) - { - if (m_pElement && ( m_pElement->m_etType == etPicture || - m_pElement->m_etType == etAudio || - m_pElement->m_etType == etVideo)) //фон для картинки с празрачностью - { - brush_writer.WriteString(L""); - } - else - { - std::wstring strRid = m_pRels->WriteImage(brush.TexturePath); + PPT_FORMAT::CStringWriter brush_writer; - brush_writer.WriteString(L""); - - if ( brush.TextureMode == c_BrushTextureModeTile) - brush_writer.WriteString(L""); - else - brush_writer.WriteString(L""); + if (brush.Type == c_BrushTypeTexture) + { + if (m_pElement && ( m_pElement->m_etType == etPicture || + m_pElement->m_etType == etAudio || + m_pElement->m_etType == etVideo)) //фон для картинки с празрачностью + { + brush_writer.WriteString(L""); + } + else + { + std::wstring strRid = m_pRels->WriteImage(brush.TexturePath); - brush_writer.WriteString(L""); - } - } - else if ( brush.Type == c_BrushTypeNoFill ) - { - brush_writer.WriteString(L""); - } - else if ( brush.Type == c_BrushTypePathGradient1 || - brush.Type == c_BrushTypePathGradient2 || - brush.Type == c_BrushTypeCenter || - brush.Type == c_BrushTypeHorizontal || - brush.Type == c_BrushTypeVertical ) - { - brush_writer.WriteString(L""); - if (brush.ColorsPosition.empty() == false) - { - for (size_t i = 0; i < brush.ColorsPosition.size(); i++) - { - std::wstring str = std::to_wstring( (int)(brush.ColorsPosition[i].second * 1000)); - - brush_writer.WriteString(L""); - brush_writer.WriteString(ConvertColor(brush.ColorsPosition[i].first, 255)); - brush_writer.WriteString(L""); - } - } - else - { - brush_writer.WriteString(L""); - brush_writer.WriteString(ConvertColor(brush.Color1, brush.Alpha1)); - brush_writer.WriteString(L""); - - brush_writer.WriteString(L""); - brush_writer.WriteString(ConvertColor(brush.Color2, brush.Alpha2)); - brush_writer.WriteString(L""); - } - brush_writer.WriteString(L""); - brush_writer.WriteString(L" 180) brush.LinearAngle -= 180; + brush_writer.WriteString(L""); - double val = (90 - brush.LinearAngle) ; - if (val < 0) val = 0; - if (val > 360) val -= 360; - - std::wstring str = std::to_wstring((int)(val * 60000)); - brush_writer.WriteString(str); - } - brush_writer.WriteString(L"\" scaled=\"1\"/>"); - brush_writer.WriteString(L""); - } - else if(brush.Type == c_BrushTypePattern) - {//типов нету в ппт - вместо них шаблон-картинка - brush_writer.WriteString(L""); - brush_writer.WriteString(L""); - brush_writer.WriteString(ConvertColor(brush.Color1, brush.Alpha1)); - brush_writer.WriteString(L""); - brush_writer.WriteString(L""); - brush_writer.WriteString(ConvertColor(brush.Color2, brush.Alpha2)); - brush_writer.WriteString(L""); - brush_writer.WriteString(L""); - } - else if (brush.Type != c_BrushTypeNotSet) - { - brush_writer.WriteString(std::wstring(L"")); - brush_writer.WriteString(ConvertColor(brush.Color1, brush.Alpha1)); - brush_writer.WriteString(std::wstring(L"")); - } - return brush_writer.GetData(); + if ( brush.TextureMode == c_BrushTextureModeTile) + brush_writer.WriteString(L""); + else + brush_writer.WriteString(L""); + + brush_writer.WriteString(L""); + } + } + else if ( brush.Type == c_BrushTypeNoFill ) + { + brush_writer.WriteString(L""); + } + else if ( brush.Type == c_BrushTypePathGradient1 || + brush.Type == c_BrushTypePathGradient2 || + brush.Type == c_BrushTypeCenter || + brush.Type == c_BrushTypeHorizontal || + brush.Type == c_BrushTypeVertical ) + { + brush_writer.WriteString(L""); + if (brush.ColorsPosition.empty() == false) + { + for (size_t i = 0; i < brush.ColorsPosition.size(); i++) + { + std::wstring str = std::to_wstring( (int)(brush.ColorsPosition[i].second * 1000)); + + brush_writer.WriteString(L""); + brush_writer.WriteString(ConvertColor(brush.ColorsPosition[i].first, 255)); + brush_writer.WriteString(L""); + } + } + else + { + brush_writer.WriteString(L""); + brush_writer.WriteString(ConvertColor(brush.Color1, brush.Alpha1)); + brush_writer.WriteString(L""); + + brush_writer.WriteString(L""); + brush_writer.WriteString(ConvertColor(brush.Color2, brush.Alpha2)); + brush_writer.WriteString(L""); + } + brush_writer.WriteString(L""); + brush_writer.WriteString(L" 180) brush.LinearAngle -= 180; + + double val = (90 - brush.LinearAngle) ; + if (val < 0) val = 0; + if (val > 360) val -= 360; + + std::wstring str = std::to_wstring((int)(val * 60000)); + brush_writer.WriteString(str); + } + brush_writer.WriteString(L"\" scaled=\"1\"/>"); + brush_writer.WriteString(L""); + } + else if(brush.Type == c_BrushTypePattern) + {//типов нету в ппт - вместо них шаблон-картинка + brush_writer.WriteString(L""); + brush_writer.WriteString(L""); + brush_writer.WriteString(ConvertColor(brush.Color1, brush.Alpha1)); + brush_writer.WriteString(L""); + brush_writer.WriteString(L""); + brush_writer.WriteString(ConvertColor(brush.Color2, brush.Alpha2)); + brush_writer.WriteString(L""); + brush_writer.WriteString(L""); + } + else if (brush.Type != c_BrushTypeNotSet) + { + brush_writer.WriteString(std::wstring(L"")); + brush_writer.WriteString(ConvertColor(brush.Color1, brush.Alpha1)); + brush_writer.WriteString(std::wstring(L"")); + } + return brush_writer.GetData(); } std::wstring PPT_FORMAT::CShapeWriter::ConvertShadow(CShadow & shadow) { - std::wstring Preset; - bool Inner = false; + std::wstring Preset; + bool Inner = false; - if (shadow.Visible == false) return _T(""); + if (shadow.Visible == false) return _T(""); - double dist = sqrt(shadow.DistanceY * shadow.DistanceY + shadow.DistanceX * shadow.DistanceX); - double dir = 0; - - if (fabs(shadow.DistanceY) > 0) - { - dir = 180 * atan(shadow.DistanceX / shadow.DistanceY) / 3.1415926; + double dist = sqrt(shadow.DistanceY * shadow.DistanceY + shadow.DistanceX * shadow.DistanceX); + double dir = 0; - if (dir < 0) dir += 180; + if (fabs(shadow.DistanceY) > 0) + { + dir = 180 * atan(shadow.DistanceX / shadow.DistanceY) / 3.1415926; - if (shadow.DistanceX < 0 && shadow.DistanceY < 0) dir *= 10; - } + if (dir < 0) dir += 180; - if (shadow.Type == 1) Preset = L"shdw13"; + if (shadow.DistanceX < 0 && shadow.DistanceY < 0) dir *= 10; + } - if (shadow.Type == 5) - { - if (shadow.DistanceX < 0 && shadow.DistanceY < 0) Preset = L"shdw18"; - else Preset = L"shdw17"; - } - if (shadow.Type == 2 && shadow.OriginX < 0) - { - if (shadow.OriginX < -1.4) - { - if (shadow.ScaleYToY < 0) Preset = L"shdw15"; - else Preset = L"shdw11"; - } - else - { - if (shadow.ScaleYToY < 0) Preset = L"shdw16"; - else Preset = L"shdw12"; - } - } + if (shadow.Type == 1) Preset = L"shdw13"; - std::wstring strDir; - std::wstring strDist; + if (shadow.Type == 5) + { + if (shadow.DistanceX < 0 && shadow.DistanceY < 0) Preset = L"shdw18"; + else Preset = L"shdw17"; + } + if (shadow.Type == 2 && shadow.OriginX < 0) + { + if (shadow.OriginX < -1.4) + { + if (shadow.ScaleYToY < 0) Preset = L"shdw15"; + else Preset = L"shdw11"; + } + else + { + if (shadow.ScaleYToY < 0) Preset = L"shdw16"; + else Preset = L"shdw12"; + } + } - if (shadow.DistanceY != 0 && shadow.DistanceX != 0) - { - if (shadow.DistanceY < 0 && shadow.DistanceX < 0) dir /=2; + std::wstring strDir; + std::wstring strDist; - strDir = L" dir=\"" + std::to_wstring((int)(dir * 60000)) + L"\""; - strDist = L" dist=\"" + std::to_wstring((int)dist) + L"\""; - } + if (shadow.DistanceY != 0 && shadow.DistanceX != 0) + { + if (shadow.DistanceY < 0 && shadow.DistanceX < 0) dir /=2; - std::wstring strSY; - if (shadow.ScaleYToY < 1 || shadow.ScaleYToY > 1) - { - if (shadow.ScaleYToX < 1)shadow.ScaleYToY = -shadow.ScaleYToY; + strDir = L" dir=\"" + std::to_wstring((int)(dir * 60000)) + L"\""; + strDist = L" dist=\"" + std::to_wstring((int)dist) + L"\""; + } - strSY = L" sy=\"" + std::to_wstring((int)(shadow.ScaleYToY * 100000)) + L"\""; - } - std::wstring strSX; - if (shadow.ScaleYToX < 1 || shadow.ScaleYToX > 1) - { - strSX = L" kx=\"" + std::to_wstring((int)((shadow.ScaleYToX + 0.5) * 360000)) + L"\""; - } - PPT_FORMAT::CStringWriter shadow_writer; - - shadow_writer.WriteString(L""); + std::wstring strSY; + if (shadow.ScaleYToY < 1 || shadow.ScaleYToY > 1) + { + if (shadow.ScaleYToX < 1)shadow.ScaleYToY = -shadow.ScaleYToY; - if (!Preset.empty()) - { - shadow_writer.WriteString(L""); + strSY = L" sy=\"" + std::to_wstring((int)(shadow.ScaleYToY * 100000)) + L"\""; + } + std::wstring strSX; + if (shadow.ScaleYToX < 1 || shadow.ScaleYToX > 1) + { + strSX = L" kx=\"" + std::to_wstring((int)((shadow.ScaleYToX + 0.5) * 360000)) + L"\""; + } + PPT_FORMAT::CStringWriter shadow_writer; - shadow_writer.WriteString(ConvertColor(shadow.Color,shadow.Alpha)); - shadow_writer.WriteString(L""); - } - else if (Inner) - { - shadow_writer.WriteString(L""); + shadow_writer.WriteString(L""); - shadow_writer.WriteString(ConvertColor(shadow.Color,shadow.Alpha)); - shadow_writer.WriteString(L""); - } - else - { - shadow_writer.WriteString(L""); + if (!Preset.empty()) + { + shadow_writer.WriteString(L""); - shadow_writer.WriteString(ConvertColor(shadow.Color,shadow.Alpha)); - shadow_writer.WriteString(L""); - } - shadow_writer.WriteString(L""); - return shadow_writer.GetData(); + shadow_writer.WriteString(ConvertColor(shadow.Color,shadow.Alpha)); + shadow_writer.WriteString(L""); + } + else if (Inner) + { + shadow_writer.WriteString(L""); + + shadow_writer.WriteString(ConvertColor(shadow.Color,shadow.Alpha)); + shadow_writer.WriteString(L""); + } + else + { + shadow_writer.WriteString(L""); + + shadow_writer.WriteString(ConvertColor(shadow.Color,shadow.Alpha)); + shadow_writer.WriteString(L""); + } + shadow_writer.WriteString(L""); + return shadow_writer.GetData(); } std::wstring PPT_FORMAT::CShapeWriter::ConvertColor(CColor & color, long alpha) { - PPT_FORMAT::CStringWriter color_writer; - if (color.m_lSchemeIndex == -1) + PPT_FORMAT::CStringWriter color_writer; + if (color.m_lSchemeIndex == -1) { - if (255 == alpha) - { + if (255 == alpha) + { color_writer.WriteString(L""); - } - else - { + } + else + { color_writer.WriteString(L"" + L""); - } - } - else - { - if (255 == alpha) - { - color_writer.WriteString(L""); - } - else - { - std::wstring strAlpha = std::to_wstring((int)(alpha * 100000 / 255)); - color_writer.WriteString(L""); - } - } - return color_writer.GetData(); + } + } + else + { + if (255 == alpha) + { + color_writer.WriteString(L""); + } + else + { + std::wstring strAlpha = std::to_wstring((int)(alpha * 100000 / 255)); + color_writer.WriteString(L""); + } + } + return color_writer.GetData(); } void PPT_FORMAT::CShapeWriter::WriteImageInfo() { CImageElement* pImageElement = dynamic_cast(m_pElement.get()); - if (!pImageElement) return; - - CAudioElement* pAudioElement = dynamic_cast(pImageElement); + if (!pImageElement) return; + + CAudioElement* pAudioElement = dynamic_cast(pImageElement); CVideoElement* pVideoElement = dynamic_cast(pImageElement); - - m_oWriter.WriteString(std::wstring(L"")); - if (pImageElement->m_lID < 0) - pImageElement->m_lID = m_lNextShapeID; + m_oWriter.WriteString(std::wstring(L"")); - std::wstring strShapeID = std::to_wstring(pImageElement->m_lID); - - m_oWriter.WriteString(std::wstring(L"m_sName.empty()) - { - if (pAudioElement) pImageElement->m_sName = std::wstring(L"Audio ") + strShapeID; - else if (pVideoElement) pImageElement->m_sName = std::wstring(L"Video ") + strShapeID; - else pImageElement->m_sName = std::wstring(L"Image ") + strShapeID; - } - - if (pImageElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); + if (pImageElement->m_lID < 0) + pImageElement->m_lID = m_lNextShapeID; - m_oWriter.WriteString(std::wstring(L" name=\"")); - m_oWriter.WriteStringXML(pImageElement->m_sName); - m_oWriter.WriteString(std::wstring(L"\"")); - - if (!pImageElement->m_sDescription.empty()) - {//бывает всякая разная бяка сохранена - m_oWriter.WriteString(std::wstring(L" descr=\"")); - m_oWriter.WriteString(XmlUtils::EncodeXmlStringExtend(pImageElement->m_sDescription, true)); - m_oWriter.WriteString(std::wstring(L"\"")); - } - m_oWriter.WriteString(std::wstring(L">")); + std::wstring strShapeID = std::to_wstring(pImageElement->m_lID); + + m_oWriter.WriteString(std::wstring(L"m_sName.empty()) + { + if (pAudioElement) pImageElement->m_sName = std::wstring(L"Audio ") + strShapeID; + else if (pVideoElement) pImageElement->m_sName = std::wstring(L"Video ") + strShapeID; + else pImageElement->m_sName = std::wstring(L"Image ") + strShapeID; + } + + if (pImageElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); + + m_oWriter.WriteString(std::wstring(L" name=\"")); + m_oWriter.WriteStringXML(pImageElement->m_sName); + m_oWriter.WriteString(std::wstring(L"\"")); + + if (!pImageElement->m_sDescription.empty()) + {//бывает всякая разная бяка сохранена + m_oWriter.WriteString(std::wstring(L" descr=\"")); + m_oWriter.WriteString(XmlUtils::EncodeXmlStringExtend(pImageElement->m_sDescription, true)); + m_oWriter.WriteString(std::wstring(L"\"")); + } + m_oWriter.WriteString(std::wstring(L">")); - if (pVideoElement || pAudioElement) - { - m_oWriter.WriteString(std::wstring(L"")); - } + WriteHyperlink(m_pElement->m_arrActions); - m_oWriter.WriteString(std::wstring(L"m_bChildAnchorEnabled) - { - m_oWriter.WriteString(std::wstring(L" noGrp=\"1\"")); - } - m_oWriter.WriteString(std::wstring(L" noChangeAspect=\"1\"/>")); + m_oWriter.WriteString(std::wstring(L"m_bChildAnchorEnabled) + { + m_oWriter.WriteString(std::wstring(L" noGrp=\"1\"")); + } + m_oWriter.WriteString(std::wstring(L" noChangeAspect=\"1\"/>")); - m_oWriter.WriteString(std::wstring(L"")); - - if (-1 != pImageElement->m_lPlaceholderType) - { - m_oWriter.WriteString(std::wstring(L"m_lPlaceholderType > 0 && pImageElement->m_lPlaceholderType != PT_Body_Empty) - m_oWriter.WriteString(std::wstring(L" type=\"") + GetPhType(pImageElement->m_lPlaceholderType) + L"\""); - - if (-1 != pImageElement->m_lPlaceholderID) - { - std::wstring strIdx = std::to_wstring(pImageElement->m_lPlaceholderID ); - m_oWriter.WriteString(std::wstring(L" idx=\"") + strIdx + L"\""); + ++m_lNextShapeID; - } - m_oWriter.WriteString(std::wstring(L"/>")); - } + m_oWriter.WriteString(std::wstring(L"")); - std::wstring sMediaFile; - - if ((pVideoElement) && (!pVideoElement->m_strVideoFileName.empty())) - { - bool bExternal = false; - std::wstring strRid = m_pRels->WriteVideo(pVideoElement->m_strVideoFileName, bExternal); - - m_oWriter.WriteString(L""); + if (-1 != pImageElement->m_lPlaceholderType) + { + m_oWriter.WriteString(std::wstring(L"m_strVideoFileName; - } + if (pImageElement->m_lPlaceholderType > 0 && pImageElement->m_lPlaceholderType != PT_Body_Empty) + m_oWriter.WriteString(std::wstring(L" type=\"") + GetPhType(pImageElement->m_lPlaceholderType) + L"\""); - if ((pAudioElement) && (!pAudioElement->m_strAudioFileName.empty())) - { - bool bExternal = false; - std::wstring strRid = m_pRels->WriteAudio(pAudioElement->m_strAudioFileName, bExternal); + if (-1 != pImageElement->m_lPlaceholderID) + { + std::wstring strIdx = std::to_wstring(pImageElement->m_lPlaceholderID ); + m_oWriter.WriteString(std::wstring(L" idx=\"") + strIdx + L"\""); - m_oWriter.WriteString(L""); - - sMediaFile = bExternal ? L"" : pAudioElement->m_strAudioFileName; - } - if (sMediaFile.empty() == false) - { - std::wstring strRid = m_pRels->WriteMedia(sMediaFile); - if (!strRid.empty()) - { - m_oWriter.WriteString(L"\ -"); - } - } + } + m_oWriter.WriteString(std::wstring(L"/>")); + } + + std::wstring sMediaFile; + + if ((pVideoElement) && (!pVideoElement->m_strVideoFileName.empty())) + { + bool bExternal = false; + std::wstring strRid = m_pRels->WriteVideo(pVideoElement->m_strVideoFileName, bExternal); + + m_oWriter.WriteString(L""); + + sMediaFile = bExternal ? L"" : pVideoElement->m_strVideoFileName; + } + + if ((pAudioElement) && (!pAudioElement->m_strAudioFileName.empty())) + { + bool bExternal = false; + std::wstring strRid = m_pRels->WriteAudio(pAudioElement->m_strAudioFileName, bExternal); + + m_oWriter.WriteString(L""); + + sMediaFile = bExternal ? L"" : pAudioElement->m_strAudioFileName; + } + if (sMediaFile.empty() == false) + { + std::wstring strRid = m_pRels->WriteMedia(sMediaFile); + if (!strRid.empty()) + { + m_oWriter.WriteString(L"\ + "); + } + } + + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"")); - std::wstring str2 = _T(""); - m_oWriter.WriteString(str2); + m_oWriter.WriteString(str2); } void PPT_FORMAT::CShapeWriter::WriteGroupInfo() { - CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); - if (!pGroupElement) return; + CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); + if (!pGroupElement) return; - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - if (pGroupElement->m_lID < 0) - pGroupElement->m_lID = m_lNextShapeID; + if (pGroupElement->m_lID < 0) + pGroupElement->m_lID = m_lNextShapeID; - std::wstring strShapeID = std::to_wstring(pGroupElement->m_lID); + std::wstring strShapeID = std::to_wstring(pGroupElement->m_lID); - m_oWriter.WriteString(std::wstring(L"m_sName.empty()) pGroupElement->m_sName = std::wstring(L"Group ") + strShapeID; + if (pGroupElement->m_sName.empty()) pGroupElement->m_sName = std::wstring(L"Group ") + strShapeID; - if (pGroupElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); - - m_oWriter.WriteString(std::wstring(L" name=\"")); - m_oWriter.WriteStringXML(pGroupElement->m_sName); - m_oWriter.WriteString(std::wstring(L"\"")); + if (pGroupElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); - if (!pGroupElement->m_sDescription.empty()) - { - m_oWriter.WriteString(std::wstring(L" descr=\"")); - m_oWriter.WriteStringXML(pGroupElement->m_sDescription); - m_oWriter.WriteString(std::wstring(L"\"")); - } - m_oWriter.WriteString(std::wstring(L">")); - if (!pGroupElement->m_sHyperlink.empty()) - { + m_oWriter.WriteString(std::wstring(L" name=\"")); + m_oWriter.WriteStringXML(pGroupElement->m_sName); + m_oWriter.WriteString(std::wstring(L"\"")); + + if (!pGroupElement->m_sDescription.empty()) + { + m_oWriter.WriteString(std::wstring(L" descr=\"")); + m_oWriter.WriteStringXML(pGroupElement->m_sDescription); + m_oWriter.WriteString(std::wstring(L"\"")); + } + m_oWriter.WriteString(std::wstring(L">")); + if (!pGroupElement->m_sHyperlink.empty()) + { std::wstring rId = m_pRels->WriteHyperlink(pGroupElement->m_sHyperlink); - m_oWriter.WriteString(std::wstring(L"")); - } - m_oWriter.WriteString(std::wstring(L"")); - - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + } + m_oWriter.WriteString(std::wstring(L"")); - ++m_lNextShapeID; + m_oWriter.WriteString(std::wstring(L"")); + + ++m_lNextShapeID; + + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"")); - std::wstring str2 = _T(""); - m_oWriter.WriteString(str2); + m_oWriter.WriteString(str2); } void PPT_FORMAT::CShapeWriter::WriteTableInfo() @@ -829,13 +826,13 @@ void PPT_FORMAT::CShapeWriter::WriteTableInfo() if (pGroupElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); m_oWriter.WriteString(std::wstring(L" name=\"")); - m_oWriter.WriteStringXML(pGroupElement->m_sName); + m_oWriter.WriteStringXML(pGroupElement->m_sName); m_oWriter.WriteString(std::wstring(L"\"")); if (!pGroupElement->m_sDescription.empty()) { m_oWriter.WriteString(std::wstring(L" descr=\"")); - m_oWriter.WriteStringXML(pGroupElement->m_sDescription); + m_oWriter.WriteStringXML(pGroupElement->m_sDescription); m_oWriter.WriteString(std::wstring(L"\"")); } m_oWriter.WriteString(std::wstring(L">")); @@ -844,8 +841,8 @@ void PPT_FORMAT::CShapeWriter::WriteTableInfo() std::wstring rId = m_pRels->WriteHyperlink(pGroupElement->m_sHyperlink); m_oWriter.WriteString(std::wstring(L"")); } m_oWriter.WriteString(std::wstring(L"")); @@ -862,539 +859,539 @@ void PPT_FORMAT::CShapeWriter::WriteTableInfo() void PPT_FORMAT::CShapeWriter::WriteShapeInfo() { - CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); - if (!pShapeElement) return; + CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); + if (!pShapeElement) return; - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - if (pShapeElement->m_lID < 0) - pShapeElement->m_lID = m_lNextShapeID; + if (pShapeElement->m_lID < 0) + pShapeElement->m_lID = m_lNextShapeID; - std::wstring strShapeID = std::to_wstring(pShapeElement->m_lID); + std::wstring strShapeID = std::to_wstring(pShapeElement->m_lID); - m_oWriter.WriteString(std::wstring(L"m_sName.empty()) pShapeElement->m_sName = std::wstring(L"Shape ") + strShapeID; + if (pShapeElement->m_sName.empty()) pShapeElement->m_sName = std::wstring(L"Shape ") + strShapeID; - if (pShapeElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); - - m_oWriter.WriteString(std::wstring(L" name=\"")); - m_oWriter.WriteStringXML(pShapeElement->m_sName); - m_oWriter.WriteString(std::wstring(L"\"")); + if (pShapeElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); - if (!pShapeElement->m_sDescription.empty()) - { - m_oWriter.WriteString(std::wstring(L" descr=\"")); - m_oWriter.WriteStringXML(pShapeElement->m_sDescription); - m_oWriter.WriteString(std::wstring(L"\"")); - } - m_oWriter.WriteString(std::wstring(L">")); - WriteButton(); - if (!pShapeElement->m_sHyperlink.empty()) - { + m_oWriter.WriteString(std::wstring(L" name=\"")); + m_oWriter.WriteStringXML(pShapeElement->m_sName); + m_oWriter.WriteString(std::wstring(L"\"")); + + if (!pShapeElement->m_sDescription.empty()) + { + m_oWriter.WriteString(std::wstring(L" descr=\"")); + m_oWriter.WriteStringXML(pShapeElement->m_sDescription); + m_oWriter.WriteString(std::wstring(L"\"")); + } + m_oWriter.WriteString(std::wstring(L">")); + WriteHyperlink(m_pElement->m_arrActions); + if (!pShapeElement->m_sHyperlink.empty()) + { std::wstring rId = m_pRels->WriteHyperlink(pShapeElement->m_sHyperlink); - m_oWriter.WriteString(std::wstring(L"")); - } - m_oWriter.WriteString(std::wstring(L"")); - - m_oWriter.WriteString(std::wstring(L"m_bChildAnchorEnabled) - { - m_oWriter.WriteString(std::wstring(L" noGrp=\"1\"")); - } - m_oWriter.WriteString(std::wstring(L" noChangeShapeType=\"1\"/>")); + m_oWriter.WriteString(std::wstring(L"")); + } + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"m_bChildAnchorEnabled) + { + m_oWriter.WriteString(std::wstring(L" noGrp=\"1\"")); + } + m_oWriter.WriteString(std::wstring(L" noChangeShapeType=\"1\"/>")); + + m_oWriter.WriteString(std::wstring(L"")); + + ++m_lNextShapeID; + + if (-1 != pShapeElement->m_lPlaceholderType) + { + m_oWriter.WriteString(std::wstring(L"m_lPlaceholderType > 0 && pShapeElement->m_lPlaceholderType != PT_Body_Empty) + m_oWriter.WriteString(std::wstring(L" type=\"") + GetPhType(pShapeElement->m_lPlaceholderType) + _T("\"")); + + if ( pShapeElement->m_lPlaceholderID != -1) + { + std::wstring strIdx = std::to_wstring( pShapeElement->m_lPlaceholderID ); + m_oWriter.WriteString(std::wstring(L" idx=\"") + strIdx + L"\""); + } + + if (pShapeElement->m_lPlaceholderSizePreset > 1 && !isTitlePlaceholder(pShapeElement->m_lPlaceholderType)) + { + if (pShapeElement->m_lPlaceholderSizePreset == 1) + m_oWriter.WriteString(std::wstring(L" size=\"half\"")); + else if (pShapeElement->m_lPlaceholderSizePreset == 2) + m_oWriter.WriteString(std::wstring(L" size=\"quarter\"")); + else if (pShapeElement->m_lPlaceholderSizePreset == 3) + { + if (isBodyPlaceholder(pShapeElement->m_lPlaceholderType)) + m_oWriter.WriteString(std::wstring(L" size=\"half\"")); + else + m_oWriter.WriteString(std::wstring(L" size=\"quarter\"")); + } + } + m_oWriter.WriteString(std::wstring(L"/>")); + } + else + { + m_oWriter.WriteString(std::wstring(L"")); + } - if (-1 != pShapeElement->m_lPlaceholderType) - { - m_oWriter.WriteString(std::wstring(L"m_lPlaceholderType > 0 && pShapeElement->m_lPlaceholderType != PT_Body_Empty) - m_oWriter.WriteString(std::wstring(L" type=\"") + GetPhType(pShapeElement->m_lPlaceholderType) + _T("\"")); - - if ( pShapeElement->m_lPlaceholderID != -1) - { - std::wstring strIdx = std::to_wstring( pShapeElement->m_lPlaceholderID ); - m_oWriter.WriteString(std::wstring(L" idx=\"") + strIdx + L"\""); - } - - if (pShapeElement->m_lPlaceholderSizePreset > 1 && !isTitlePlaceholder(pShapeElement->m_lPlaceholderType)) - { - if (pShapeElement->m_lPlaceholderSizePreset == 1) - m_oWriter.WriteString(std::wstring(L" size=\"half\"")); - else if (pShapeElement->m_lPlaceholderSizePreset == 2) - m_oWriter.WriteString(std::wstring(L" size=\"quarter\"")); - else if (pShapeElement->m_lPlaceholderSizePreset == 3) - { - if (isBodyPlaceholder(pShapeElement->m_lPlaceholderType)) - m_oWriter.WriteString(std::wstring(L" size=\"half\"")); - else - m_oWriter.WriteString(std::wstring(L" size=\"quarter\"")); - } - } - m_oWriter.WriteString(std::wstring(L"/>")); - } - else - { - m_oWriter.WriteString(std::wstring(L"")); - } - std::wstring str2 = _T(""); - m_oWriter.WriteString(str2); + m_oWriter.WriteString(str2); } void PPT_FORMAT::CShapeWriter::Write3dShape() { - CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); - if (!pShapeElement) return; + CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); + if (!pShapeElement) return; - CPPTShape *pPPTShape = dynamic_cast(pShapeElement->m_pShape->getBaseShape().get()); - if (!pPPTShape) return; + CPPTShape *pPPTShape = dynamic_cast(pShapeElement->m_pShape->getBaseShape().get()); + if (!pPPTShape) return; - if (!pPPTShape->m_o3dOptions.bEnabled) return; + if (!pPPTShape->m_o3dOptions.bEnabled) return; - //{ - // std::cout << "........................................................................\n"; - // std::wcout << pShapeElement->m_sName << L"\n"; - // if (pPPTShape->m_o3dOptions.dSpecularAmt) - // { - // std::cout << "SpecularAmt\t" << (*pPPTShape->m_o3dOptions.dSpecularAmt) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dDiffuseAmt) - // { - // std::cout << "iffuseAmt\t" << (*pPPTShape->m_o3dOptions.dDiffuseAmt) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dShininess) - // { - // std::cout << "Shininess\t" << (*pPPTShape->m_o3dOptions.dShininess) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dXRotationAngle) - // { - // std::cout << "XRotationAngle\t" << (*pPPTShape->m_o3dOptions.dXRotationAngle) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dYRotationAngle) - // { - // std::cout << "YRotationAngle\t" << (*pPPTShape->m_o3dOptions.dYRotationAngle) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dRotationAxisX) - // { - // std::cout << "RotationAxisX\t" << (*pPPTShape->m_o3dOptions.dRotationAxisX) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dRotationAxisY) - // { - // std::cout << "RotationAxisY\t" << (*pPPTShape->m_o3dOptions.dRotationAxisY) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dRotationAxisZ) - // { - // std::cout << "RotationAxisZ\t" << (*pPPTShape->m_o3dOptions.dRotationAxisZ) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dRotationAngle) - // { - // std::cout << "RotationAngle\t" << (*pPPTShape->m_o3dOptions.dRotationAngle) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dRotationCenterX) - // { - // std::cout << "RotationCenterX\t" << (*pPPTShape->m_o3dOptions.dRotationCenterX) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dRotationCenterY) - // { - // std::cout << "RotationCenterY\t" << (*pPPTShape->m_o3dOptions.dRotationCenterY) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dRotationCenterZ) - // { - // std::cout << "RotationCenterZ\t" << (*pPPTShape->m_o3dOptions.dRotationCenterZ) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dTolerance) - // { - // std::cout << "Tolerance\t" << (*pPPTShape->m_o3dOptions.dTolerance) << "\n"; - // } - // std::cout << "XViewpoint\t" << (pPPTShape->m_o3dOptions.dXViewpoint) << "\n"; - // std::cout << "YViewpoint\t" << (pPPTShape->m_o3dOptions.dYViewpoint) << "\n"; - // if (pPPTShape->m_o3dOptions.dZViewpoint) - // { - // std::cout << "ZViewpoint\t" << (*pPPTShape->m_o3dOptions.dZViewpoint) << "\n"; - // } - // std::cout << "OriginX\t" << (pPPTShape->m_o3dOptions.dOriginX) << "\n"; - // std::cout << "OriginY\t" << (pPPTShape->m_o3dOptions.dOriginY) << "\n"; - // std::cout << "SkewAngle\t" << (pPPTShape->m_o3dOptions.dSkewAngle) << "\n"; - // std::cout << "SkewAmount\t" << (pPPTShape->m_o3dOptions.nSkewAmount) << "\n"; + //{ + // std::cout << "........................................................................\n"; + // std::wcout << pShapeElement->m_sName << L"\n"; + // if (pPPTShape->m_o3dOptions.dSpecularAmt) + // { + // std::cout << "SpecularAmt\t" << (*pPPTShape->m_o3dOptions.dSpecularAmt) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dDiffuseAmt) + // { + // std::cout << "iffuseAmt\t" << (*pPPTShape->m_o3dOptions.dDiffuseAmt) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dShininess) + // { + // std::cout << "Shininess\t" << (*pPPTShape->m_o3dOptions.dShininess) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dXRotationAngle) + // { + // std::cout << "XRotationAngle\t" << (*pPPTShape->m_o3dOptions.dXRotationAngle) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dYRotationAngle) + // { + // std::cout << "YRotationAngle\t" << (*pPPTShape->m_o3dOptions.dYRotationAngle) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dRotationAxisX) + // { + // std::cout << "RotationAxisX\t" << (*pPPTShape->m_o3dOptions.dRotationAxisX) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dRotationAxisY) + // { + // std::cout << "RotationAxisY\t" << (*pPPTShape->m_o3dOptions.dRotationAxisY) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dRotationAxisZ) + // { + // std::cout << "RotationAxisZ\t" << (*pPPTShape->m_o3dOptions.dRotationAxisZ) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dRotationAngle) + // { + // std::cout << "RotationAngle\t" << (*pPPTShape->m_o3dOptions.dRotationAngle) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dRotationCenterX) + // { + // std::cout << "RotationCenterX\t" << (*pPPTShape->m_o3dOptions.dRotationCenterX) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dRotationCenterY) + // { + // std::cout << "RotationCenterY\t" << (*pPPTShape->m_o3dOptions.dRotationCenterY) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dRotationCenterZ) + // { + // std::cout << "RotationCenterZ\t" << (*pPPTShape->m_o3dOptions.dRotationCenterZ) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dTolerance) + // { + // std::cout << "Tolerance\t" << (*pPPTShape->m_o3dOptions.dTolerance) << "\n"; + // } + // std::cout << "XViewpoint\t" << (pPPTShape->m_o3dOptions.dXViewpoint) << "\n"; + // std::cout << "YViewpoint\t" << (pPPTShape->m_o3dOptions.dYViewpoint) << "\n"; + // if (pPPTShape->m_o3dOptions.dZViewpoint) + // { + // std::cout << "ZViewpoint\t" << (*pPPTShape->m_o3dOptions.dZViewpoint) << "\n"; + // } + // std::cout << "OriginX\t" << (pPPTShape->m_o3dOptions.dOriginX) << "\n"; + // std::cout << "OriginY\t" << (pPPTShape->m_o3dOptions.dOriginY) << "\n"; + // std::cout << "SkewAngle\t" << (pPPTShape->m_o3dOptions.dSkewAngle) << "\n"; + // std::cout << "SkewAmount\t" << (pPPTShape->m_o3dOptions.nSkewAmount) << "\n"; - // if (pPPTShape->m_o3dOptions.dAmbientIntensity) - // { - // std::cout << "AmbientIntensity\t" << (*pPPTShape->m_o3dOptions.dAmbientIntensity) << "\n"; - // } - // if (pPPTShape->m_o3dOptions.dKeyIntensity) - // { - // std::cout << "KeyIntensity\t" << (*pPPTShape->m_o3dOptions.dKeyIntensity) << "\n"; - // } - // std::cout << "KeyX\t" << (pPPTShape->m_o3dOptions.dKeyX) << "\n"; - // std::cout << "KeyY\t" << (pPPTShape->m_o3dOptions.dKeyY) << "\n"; - // if (pPPTShape->m_o3dOptions.dKeyZ) - // { - // std::cout << "KeyZ\t" << (*pPPTShape->m_o3dOptions.dKeyZ) << "\n"; - // } - // std::cout << "FillIntensity\t" << (pPPTShape->m_o3dOptions.dFillIntensity) << "\n"; - // std::cout << "FillX\t" << (pPPTShape->m_o3dOptions.dFillX) << "\n"; - // std::cout << "FillY\t" << (pPPTShape->m_o3dOptions.dFillY) << "\n"; - // if (pPPTShape->m_o3dOptions.dFillZ) - // { - // std::cout << "FillZ\t" << (*pPPTShape->m_o3dOptions.dFillZ) << "\n"; - // } - // std::cout << "........................................................................\n"; - //} + // if (pPPTShape->m_o3dOptions.dAmbientIntensity) + // { + // std::cout << "AmbientIntensity\t" << (*pPPTShape->m_o3dOptions.dAmbientIntensity) << "\n"; + // } + // if (pPPTShape->m_o3dOptions.dKeyIntensity) + // { + // std::cout << "KeyIntensity\t" << (*pPPTShape->m_o3dOptions.dKeyIntensity) << "\n"; + // } + // std::cout << "KeyX\t" << (pPPTShape->m_o3dOptions.dKeyX) << "\n"; + // std::cout << "KeyY\t" << (pPPTShape->m_o3dOptions.dKeyY) << "\n"; + // if (pPPTShape->m_o3dOptions.dKeyZ) + // { + // std::cout << "KeyZ\t" << (*pPPTShape->m_o3dOptions.dKeyZ) << "\n"; + // } + // std::cout << "FillIntensity\t" << (pPPTShape->m_o3dOptions.dFillIntensity) << "\n"; + // std::cout << "FillX\t" << (pPPTShape->m_o3dOptions.dFillX) << "\n"; + // std::cout << "FillY\t" << (pPPTShape->m_o3dOptions.dFillY) << "\n"; + // if (pPPTShape->m_o3dOptions.dFillZ) + // { + // std::cout << "FillZ\t" << (*pPPTShape->m_o3dOptions.dFillZ) << "\n"; + // } + // std::cout << "........................................................................\n"; + //} - m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"m_o3dOptions.dSkewAngle < 10) sAngle = L"Left"; - else if (pPPTShape->m_o3dOptions.dSkewAngle >= 10 && pPPTShape->m_o3dOptions.dSkewAngle < 80) sAngle = L"BottomLeft"; - else if (pPPTShape->m_o3dOptions.dSkewAngle >= 80 && pPPTShape->m_o3dOptions.dSkewAngle < 100) sAngle = L"Bottom"; - else if (pPPTShape->m_o3dOptions.dSkewAngle >= 100 && pPPTShape->m_o3dOptions.dSkewAngle < 145) sAngle = L"BottomRight"; - else if (pPPTShape->m_o3dOptions.dSkewAngle >= 145 && pPPTShape->m_o3dOptions.dSkewAngle < 190) sAngle = L"Right"; - else if (pPPTShape->m_o3dOptions.dSkewAngle >= 190 && pPPTShape->m_o3dOptions.dSkewAngle < 235) sAngle = L"TopRight"; - else if (pPPTShape->m_o3dOptions.dSkewAngle >= 235 && pPPTShape->m_o3dOptions.dSkewAngle < 280) sAngle = L"Top"; - else if (pPPTShape->m_o3dOptions.dSkewAngle >= 280 && pPPTShape->m_o3dOptions.dSkewAngle < 325) sAngle = L"TopLeft"; - else sAngle = L"Front"; + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"m_o3dOptions.bParallel) - m_oWriter.WriteString(std::wstring(L" prst=\"legacyOblique" + sAngle + L"\"")); - else - m_oWriter.WriteString(std::wstring(L" prst=\"legacyPerspective" + sAngle + L"\"")); - m_oWriter.WriteString(std::wstring(L">")); - if (pPPTShape->m_o3dOptions.bConstrainRotation) - { - m_oWriter.WriteString(std::wstring(L"m_o3dOptions.dXRotationAngle.get_value_or(0))) + L"\"")); - m_oWriter.WriteString(std::wstring(L" lon=\"" + std::to_wstring((int)(60000 * pPPTShape->m_o3dOptions.dYRotationAngle.get_value_or(0))) + L"\"")); - m_oWriter.WriteString(std::wstring(L" rev=\"" + std::to_wstring((int)(60000 * pPPTShape->m_o3dOptions.dRotationAngle.get_value_or(0))) + L"\"")); - m_oWriter.WriteString(std::wstring(L"/>")); - } - m_oWriter.WriteString(std::wstring(L"")); + std::wstring sAngle; + if (pPPTShape->m_o3dOptions.dSkewAngle < 10) sAngle = L"Left"; + else if (pPPTShape->m_o3dOptions.dSkewAngle >= 10 && pPPTShape->m_o3dOptions.dSkewAngle < 80) sAngle = L"BottomLeft"; + else if (pPPTShape->m_o3dOptions.dSkewAngle >= 80 && pPPTShape->m_o3dOptions.dSkewAngle < 100) sAngle = L"Bottom"; + else if (pPPTShape->m_o3dOptions.dSkewAngle >= 100 && pPPTShape->m_o3dOptions.dSkewAngle < 145) sAngle = L"BottomRight"; + else if (pPPTShape->m_o3dOptions.dSkewAngle >= 145 && pPPTShape->m_o3dOptions.dSkewAngle < 190) sAngle = L"Right"; + else if (pPPTShape->m_o3dOptions.dSkewAngle >= 190 && pPPTShape->m_o3dOptions.dSkewAngle < 235) sAngle = L"TopRight"; + else if (pPPTShape->m_o3dOptions.dSkewAngle >= 235 && pPPTShape->m_o3dOptions.dSkewAngle < 280) sAngle = L"Top"; + else if (pPPTShape->m_o3dOptions.dSkewAngle >= 280 && pPPTShape->m_o3dOptions.dSkewAngle < 325) sAngle = L"TopLeft"; + else sAngle = L"Front"; - m_oWriter.WriteString(std::wstring(L"m_o3dOptions.dFillIntensity < 0.3) - m_oWriter.WriteString(std::wstring(L" rig=\"legacyHarsh3\"")); - else if (pPPTShape->m_o3dOptions.dFillIntensity < 0.4) - m_oWriter.WriteString(std::wstring(L" rig=\"legacyFlat4\"")); - else if (pPPTShape->m_o3dOptions.dFillIntensity > 0.6 || - (pPPTShape->m_o3dOptions.dKeyX < 0.1 && pPPTShape->m_o3dOptions.dFillX < 0.1 && - pPPTShape->m_o3dOptions.dKeyY < 0.1 && pPPTShape->m_o3dOptions.dFillY < 0.1)) - m_oWriter.WriteString(std::wstring(L" rig=\"legacyFlat1\"")); - else - m_oWriter.WriteString(std::wstring(L" rig=\"legacyFlat3\"")); + if (pPPTShape->m_o3dOptions.bParallel) + m_oWriter.WriteString(std::wstring(L" prst=\"legacyOblique" + sAngle + L"\"")); + else + m_oWriter.WriteString(std::wstring(L" prst=\"legacyPerspective" + sAngle + L"\"")); + m_oWriter.WriteString(std::wstring(L">")); + if (pPPTShape->m_o3dOptions.bConstrainRotation) + { + m_oWriter.WriteString(std::wstring(L"m_o3dOptions.dXRotationAngle.get_value_or(0))) + L"\"")); + m_oWriter.WriteString(std::wstring(L" lon=\"" + std::to_wstring((int)(60000 * pPPTShape->m_o3dOptions.dYRotationAngle.get_value_or(0))) + L"\"")); + m_oWriter.WriteString(std::wstring(L" rev=\"" + std::to_wstring((int)(60000 * pPPTShape->m_o3dOptions.dRotationAngle.get_value_or(0))) + L"\"")); + m_oWriter.WriteString(std::wstring(L"/>")); + } + m_oWriter.WriteString(std::wstring(L"")); - if (pPPTShape->m_o3dOptions.dKeyX < 0.1 && pPPTShape->m_o3dOptions.dFillX < 0.1) - { - if (pPPTShape->m_o3dOptions.dKeyY < 0.1 && pPPTShape->m_o3dOptions.dFillY < 0.1) - m_oWriter.WriteString(std::wstring(L" dir=\"t\"")); - else if (pPPTShape->m_o3dOptions.dKeyY < 0) m_oWriter.WriteString(std::wstring(L" dir=\"r\"")); - else m_oWriter.WriteString(std::wstring(L" dir=\"l\"")); - } - else - { - if (pPPTShape->m_o3dOptions.dKeyX < 0) m_oWriter.WriteString(std::wstring(L" dir=\"t\"")); - else m_oWriter.WriteString(std::wstring(L" dir=\"b\"")); - } - m_oWriter.WriteString(std::wstring(L"/>")); - m_oWriter.WriteString(std::wstring(L"")); - - m_oWriter.WriteString(std::wstring(L"m_o3dOptions.nExtrudeBackward) + L"\"")); + m_oWriter.WriteString(std::wstring(L"m_o3dOptions.dFillIntensity < 0.3) + m_oWriter.WriteString(std::wstring(L" rig=\"legacyHarsh3\"")); + else if (pPPTShape->m_o3dOptions.dFillIntensity < 0.4) + m_oWriter.WriteString(std::wstring(L" rig=\"legacyFlat4\"")); + else if (pPPTShape->m_o3dOptions.dFillIntensity > 0.6 || + (pPPTShape->m_o3dOptions.dKeyX < 0.1 && pPPTShape->m_o3dOptions.dFillX < 0.1 && + pPPTShape->m_o3dOptions.dKeyY < 0.1 && pPPTShape->m_o3dOptions.dFillY < 0.1)) + m_oWriter.WriteString(std::wstring(L" rig=\"legacyFlat1\"")); + else + m_oWriter.WriteString(std::wstring(L" rig=\"legacyFlat3\"")); - switch(pPPTShape->m_o3dOptions.nRenderMode) - { - case 0x00000000://solid - { - if (pPPTShape->m_o3dOptions.bMetallic) - m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyMetal\"")); - else - m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyMatte\"")); - }break; - case 0x00000001: m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyWireframe\"")); break; //wireframe - case 0x00000002: m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyWireframe\"")); break; //bounding cube ???? - } + if (pPPTShape->m_o3dOptions.dKeyX < 0.1 && pPPTShape->m_o3dOptions.dFillX < 0.1) + { + if (pPPTShape->m_o3dOptions.dKeyY < 0.1 && pPPTShape->m_o3dOptions.dFillY < 0.1) + m_oWriter.WriteString(std::wstring(L" dir=\"t\"")); + else if (pPPTShape->m_o3dOptions.dKeyY < 0) m_oWriter.WriteString(std::wstring(L" dir=\"r\"")); + else m_oWriter.WriteString(std::wstring(L" dir=\"l\"")); + } + else + { + if (pPPTShape->m_o3dOptions.dKeyX < 0) m_oWriter.WriteString(std::wstring(L" dir=\"t\"")); + else m_oWriter.WriteString(std::wstring(L" dir=\"b\"")); + } + m_oWriter.WriteString(std::wstring(L"/>")); + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L">")); + m_oWriter.WriteString(std::wstring(L"m_o3dOptions.nExtrudeBackward) + L"\"")); - m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"")); + switch(pPPTShape->m_o3dOptions.nRenderMode) + { + case 0x00000000://solid + { + if (pPPTShape->m_o3dOptions.bMetallic) + m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyMetal\"")); + else + m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyMatte\"")); + }break; + case 0x00000001: m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyWireframe\"")); break; //wireframe + case 0x00000002: m_oWriter.WriteString(std::wstring(L" prstMaterial=\"legacyWireframe\"")); break; //bounding cube ???? + } - std::wstring strExtrusionClr; - if (pPPTShape->m_o3dOptions.oExtrusionColor) - { - strExtrusionClr = ConvertColor(*pPPTShape->m_o3dOptions.oExtrusionColor); - } - else - { - if (pShapeElement->m_oBrush.Type != c_BrushTypeNoFill) - { - strExtrusionClr = ConvertColor(pShapeElement->m_oBrush.Color1, pShapeElement->m_oBrush.Alpha1); - } - else - { - strExtrusionClr = ConvertColor(pShapeElement->m_oPen.Color, pShapeElement->m_oPen.Alpha); - } - } - m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(strExtrusionClr); - m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(strExtrusionClr); - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L">")); - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + + std::wstring strExtrusionClr; + if (pPPTShape->m_o3dOptions.oExtrusionColor) + { + strExtrusionClr = ConvertColor(*pPPTShape->m_o3dOptions.oExtrusionColor); + } + else + { + if (pShapeElement->m_oBrush.Type != c_BrushTypeNoFill) + { + strExtrusionClr = ConvertColor(pShapeElement->m_oBrush.Color1, pShapeElement->m_oBrush.Alpha1); + } + else + { + strExtrusionClr = ConvertColor(pShapeElement->m_oPen.Color, pShapeElement->m_oPen.Alpha); + } + } + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(strExtrusionClr); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(strExtrusionClr); + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); } void PPT_FORMAT::CShapeWriter::WriteTextInfo() { - //if (false == m_xmlTxBodyAlternative.empty()) - //{ - // m_oWriter.WriteString(m_xmlTxBodyAlternative); + //if (false == m_xmlTxBodyAlternative.empty()) + //{ + // m_oWriter.WriteString(m_xmlTxBodyAlternative); - // return; - //} - CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); - if (!pShapeElement) return; + // return; + //} + CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); + if (!pShapeElement) return; - CDoubleRect oTextRect; + CDoubleRect oTextRect; - size_t nCount = pShapeElement->m_pShape->m_oText.m_arParagraphs.size(); + size_t nCount = pShapeElement->m_pShape->m_oText.m_arParagraphs.size(); - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"m_pShape->GetTextRect(oTextRect); + pShapeElement->m_pShape->GetTextRect(oTextRect); std::wstring str = L" lIns=\"" + std::to_wstring((int)oTextRect.left) + L"\" tIns=\"" + std::to_wstring((int)oTextRect.top) + - L"\" rIns=\"" + std::to_wstring((int)oTextRect.right) + L"\" bIns=\"" + std::to_wstring((int)oTextRect.bottom) + L"\""; - - m_oWriter.WriteString(str); - -// m_oWriter.WriteString(std::wstring(L" lIns=\"0\" tIns=\"0\" rIns=\"0\" bIns=\"0\"")); + L"\" rIns=\"" + std::to_wstring((int)oTextRect.right) + L"\" bIns=\"" + std::to_wstring((int)oTextRect.bottom) + L"\""; - if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical == 0 ) - m_oWriter.WriteString(L" anchor=\"t\""); - else if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical == 2 ) - m_oWriter.WriteString(L" anchor=\"b\""); - else if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical == 1 ) - { - m_oWriter.WriteString(L" anchor=\"ctr\""); - m_oWriter.WriteString(L" anchorCtr=\"0\""); - } - if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_dTextRotate > 0) - { - std::wstring strProp = std::to_wstring((int)(pShapeElement->m_pShape->m_oText.m_oAttributes.m_dTextRotate * 60000)); - m_oWriter.WriteString(L" rot=\"" + strProp + L"\""); - } - if (pShapeElement->m_pShape->m_oText.m_nTextFlow >= 0) - { - switch(pShapeElement->m_pShape->m_oText.m_nTextFlow) - { - case 1: - case 3: m_oWriter.WriteString(L" vert=\"vert\""); break; - case 2: m_oWriter.WriteString(L" vert=\"vert270\""); break; - case 5: m_oWriter.WriteString(L" vert=\"wordArtVert\""); break; - } - } - else if (pShapeElement->m_pShape->m_oText.m_bVertical) - { - m_oWriter.WriteString(L" vert=\"eaVert\""); - } - m_oWriter.WriteString(L">"); + m_oWriter.WriteString(str); - if (m_bWordArt) - { - std::wstring prstTxWarp = oox::Spt2WordArtShapeType((oox::MSOSPT)pShapeElement->m_lShapeType); - m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L""));//модификаторы + // m_oWriter.WriteString(std::wstring(L" lIns=\"0\" tIns=\"0\" rIns=\"0\" bIns=\"0\"")); - CPPTShape *pPPTShape = dynamic_cast(pShapeElement->m_pShape->getBaseShape().get()); - std::wstring strVal; + if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical == 0 ) + m_oWriter.WriteString(L" anchor=\"t\""); + else if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical == 2 ) + m_oWriter.WriteString(L" anchor=\"b\""); + else if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical == 1 ) + { + m_oWriter.WriteString(L" anchor=\"ctr\""); + m_oWriter.WriteString(L" anchorCtr=\"0\""); + } + if (pShapeElement->m_pShape->m_oText.m_oAttributes.m_dTextRotate > 0) + { + std::wstring strProp = std::to_wstring((int)(pShapeElement->m_pShape->m_oText.m_oAttributes.m_dTextRotate * 60000)); + m_oWriter.WriteString(L" rot=\"" + strProp + L"\""); + } + if (pShapeElement->m_pShape->m_oText.m_nTextFlow >= 0) + { + switch(pShapeElement->m_pShape->m_oText.m_nTextFlow) + { + case 1: + case 3: m_oWriter.WriteString(L" vert=\"vert\""); break; + case 2: m_oWriter.WriteString(L" vert=\"vert270\""); break; + case 5: m_oWriter.WriteString(L" vert=\"wordArtVert\""); break; + } + } + else if (pShapeElement->m_pShape->m_oText.m_bVertical) + { + m_oWriter.WriteString(L" vert=\"eaVert\""); + } + m_oWriter.WriteString(L">"); - for (size_t i = 0 ; (pPPTShape) && (i < pPPTShape->m_arAdjustments.size()); i++) - { - switch(pShapeElement->m_lShapeType) - { - case oox::msosptTextFadeUp: - { - double kf = 4.63; //"волшебный" - std::wstring strVal = std::to_wstring((int)(kf * pPPTShape->m_arAdjustments[i])); - - m_oWriter.WriteString(L""); - }break; - } - - } + if (m_bWordArt) + { + std::wstring prstTxWarp = oox::Spt2WordArtShapeType((oox::MSOSPT)pShapeElement->m_lShapeType); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L""));//модификаторы + + CPPTShape *pPPTShape = dynamic_cast(pShapeElement->m_pShape->getBaseShape().get()); + std::wstring strVal; + + for (size_t i = 0 ; (pPPTShape) && (i < pPPTShape->m_arAdjustments.size()); i++) + { + switch(pShapeElement->m_lShapeType) + { + case oox::msosptTextFadeUp: + { + double kf = 4.63; //"волшебный" + std::wstring strVal = std::to_wstring((int)(kf * pPPTShape->m_arAdjustments[i])); + + m_oWriter.WriteString(L""); + }break; + } + + } + + m_oWriter.WriteString(L""); + m_oWriter.WriteString(L""); + } + if (pShapeElement->m_pShape->m_oText.m_bAutoFit) + { + m_oWriter.WriteString(L""); + } + m_oWriter.WriteString(L""); - m_oWriter.WriteString(L""); - m_oWriter.WriteString(L""); - } - if (pShapeElement->m_pShape->m_oText.m_bAutoFit) - { - m_oWriter.WriteString(L""); - } - m_oWriter.WriteString(L""); - if (0 == nCount) - { - m_oWriter.WriteString(L""); - return; - } - m_oWriter.WriteString(L""); + { + m_oWriter.WriteString(L""); + return; + } + m_oWriter.WriteString(L""); if (!m_bWordArt) - { - CStylesWriter styleWriter(m_pTheme); - styleWriter.ConvertStyles(pShapeElement->m_pShape->m_oText.m_oStyles, m_oWriter); - } + { + CStylesWriter styleWriter(m_pTheme); + styleWriter.ConvertStyles(pShapeElement->m_pShape->m_oText.m_oStyles, m_oWriter); + } - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - for (size_t nIndexPar = 0; nIndexPar < nCount; ++nIndexPar) - { - PPT_FORMAT::CParagraph* pParagraph = &pShapeElement->m_pShape->m_oText.m_arParagraphs[nIndexPar]; + for (size_t nIndexPar = 0; nIndexPar < nCount; ++nIndexPar) + { + PPT_FORMAT::CParagraph* pParagraph = &pShapeElement->m_pShape->m_oText.m_arParagraphs[nIndexPar]; - //if (m_bWordArt && nIndexPar == nCount-1) - //{ - // if (pParagraph->m_arSpans.size() < 1) break; - // if (pParagraph->m_arSpans.size() == 1 && pParagraph->m_arSpans[0].m_strText.empty()) break; - //} + //if (m_bWordArt && nIndexPar == nCount-1) + //{ + // if (pParagraph->m_arSpans.size() < 1) break; + // if (pParagraph->m_arSpans.size() == 1 && pParagraph->m_arSpans[0].m_strText.empty()) break; + //} - std::wstring _str1 = std::to_wstring(pParagraph->m_lTextLevel); - m_oWriter.WriteString(L"m_lTextLevel); + m_oWriter.WriteString(L"m_oPFRun; + PPT_FORMAT::CTextPFRun* pPF = &pParagraph->m_oPFRun; - if (pPF->textDirection.is_init()) - { - if (pPF->textDirection.get() == 1) m_oWriter.WriteString(std::wstring(L" rtl=\"1\"")); - else m_oWriter.WriteString(std::wstring(L" rtl=\"0\"")); - } - if (pPF->fontAlign.is_init()) - { - std::wstring strProp = CStylesWriter::GetFontAlign(pPF->fontAlign.get()); - m_oWriter.WriteString(std::wstring(L" fontAlgn=\"") + strProp + L"\""); - } - int leftMargin = 0; - if (pPF->leftMargin.is_init()) - { - leftMargin = pPF->leftMargin.get(); + if (pPF->textDirection.is_init()) + { + if (pPF->textDirection.get() == 1) m_oWriter.WriteString(std::wstring(L" rtl=\"1\"")); + else m_oWriter.WriteString(std::wstring(L" rtl=\"0\"")); + } + if (pPF->fontAlign.is_init()) + { + std::wstring strProp = CStylesWriter::GetFontAlign(pPF->fontAlign.get()); + m_oWriter.WriteString(std::wstring(L" fontAlgn=\"") + strProp + L"\""); + } + int leftMargin = 0; + if (pPF->leftMargin.is_init()) + { + leftMargin = pPF->leftMargin.get(); std::wstring strProp = std::to_wstring( leftMargin ); - m_oWriter.WriteString(L" marL=\"" + strProp + L"\""); - } - if (pPF->indent.is_init()) - { - std::wstring strProp = std::to_wstring(pPF->indent.get() - leftMargin); - m_oWriter.WriteString(L" indent=\"" + strProp + L"\""); - } - if (pPF->textAlignment.is_init()) - { + m_oWriter.WriteString(L" marL=\"" + strProp + L"\""); + } + if (pPF->indent.is_init()) + { + std::wstring strProp = std::to_wstring(pPF->indent.get() - leftMargin); + m_oWriter.WriteString(L" indent=\"" + strProp + L"\""); + } + if (pPF->textAlignment.is_init()) + { std::wstring strProp = CStylesWriter::GetTextAlign(pPF->textAlignment.get()); - m_oWriter.WriteString(L" algn=\"" + strProp + L"\""); - } - if (pPF->defaultTabSize.is_init()) - { - std::wstring strProp= std::to_wstring( pPF->defaultTabSize.get()); - m_oWriter.WriteString(L" defTabSz=\"" + strProp + L"\""); - } - m_oWriter.WriteString(L">"); + m_oWriter.WriteString(L" algn=\"" + strProp + L"\""); + } + if (pPF->defaultTabSize.is_init()) + { + std::wstring strProp= std::to_wstring( pPF->defaultTabSize.get()); + m_oWriter.WriteString(L" defTabSz=\"" + strProp + L"\""); + } + m_oWriter.WriteString(L">"); - double dKoef1 = 3.52777778; // :-) чё это не понятно ... - if (pPF->lineSpacing.is_init()) - { - LONG val = pPF->lineSpacing.get(); - //1/1024 master unit or 1/589824 inch. - //1 inch = 576 master unit -> 1 master unit = 0.125 pt - if (val > 0)//The absolute value specifies spacing in master units. - { - std::wstring strProp = std::to_wstring( (int)(val* 0.125 * 100/*/ dKoef1*/)); - m_oWriter.WriteString(L""); - } - else if (val < 0 && val > -13200) - {//0 to 13200, inclusive - The value specifies spacing as a percentage of the text line height. - std::wstring strProp = std::to_wstring( -val * 1000); - m_oWriter.WriteString(L""); - } - } - if (pPF->spaceAfter.is_init()) - { - LONG val = pPF->spaceAfter.get(); - if (val > 0) - { - std::wstring strProp = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); - m_oWriter.WriteString(L""); - } - else if (val < 0 && val > -13200) - { - std::wstring strProp = std::to_wstring(-val * 1000); - m_oWriter.WriteString(L""); - } - } - if (pPF->spaceBefore.is_init()) - { - LONG val = pPF->spaceBefore.get(); - if (val > 0) - { - std::wstring strProp = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); - m_oWriter.WriteString(L""); - } - else if (val < 0 && val > -13200) - { - std::wstring strProp = std::to_wstring(-val * 1000); - m_oWriter.WriteString(L""); - } - } + double dKoef1 = 3.52777778; // :-) чё это не понятно ... + if (pPF->lineSpacing.is_init()) + { + LONG val = pPF->lineSpacing.get(); + //1/1024 master unit or 1/589824 inch. + //1 inch = 576 master unit -> 1 master unit = 0.125 pt + if (val > 0)//The absolute value specifies spacing in master units. + { + std::wstring strProp = std::to_wstring( (int)(val* 0.125 * 100/*/ dKoef1*/)); + m_oWriter.WriteString(L""); + } + else if (val < 0 && val > -13200) + {//0 to 13200, inclusive - The value specifies spacing as a percentage of the text line height. + std::wstring strProp = std::to_wstring( -val * 1000); + m_oWriter.WriteString(L""); + } + } + if (pPF->spaceAfter.is_init()) + { + LONG val = pPF->spaceAfter.get(); + if (val > 0) + { + std::wstring strProp = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); + m_oWriter.WriteString(L""); + } + else if (val < 0 && val > -13200) + { + std::wstring strProp = std::to_wstring(-val * 1000); + m_oWriter.WriteString(L""); + } + } + if (pPF->spaceBefore.is_init()) + { + LONG val = pPF->spaceBefore.get(); + if (val > 0) + { + std::wstring strProp = std::to_wstring((int)(val * 0.125 * 100/*/ dKoef1*/)); + m_oWriter.WriteString(L""); + } + else if (val < 0 && val > -13200) + { + std::wstring strProp = std::to_wstring(-val * 1000); + m_oWriter.WriteString(L""); + } + } - if (pPF->hasBullet.is_init()) - { - if (pPF->hasBullet.get()) - { - if (pPF->bulletColor.is_init()) - { - m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(ConvertColor(pPF->bulletColor.get(), 255)); - m_oWriter.WriteString(std::wstring(L"")); - } - if (pPF->bulletSize.is_init()) - { - if (pPF->bulletSize.get() > 24 && pPF->bulletSize.get() < 401) - { - std::wstring strProp = std::to_wstring(pPF->bulletSize.get() * 1000 ); - m_oWriter.WriteString(L""); - } - if (pPF->bulletSize.get() < 0 && pPF->bulletSize.get() > -4001) - { - std::wstring strProp = std::to_wstring(- pPF->bulletSize.get() ); - m_oWriter.WriteString(L""); - } - } - if (pPF->bulletFontProperties.is_init()) - { - m_oWriter.WriteString(std::wstring(L"bulletFontProperties->Name + L"\""); + if (pPF->hasBullet.is_init()) + { + if (pPF->hasBullet.get()) + { + if (pPF->bulletColor.is_init()) + { + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(ConvertColor(pPF->bulletColor.get(), 255)); + m_oWriter.WriteString(std::wstring(L"")); + } + if (pPF->bulletSize.is_init()) + { + if (pPF->bulletSize.get() > 24 && pPF->bulletSize.get() < 401) + { + std::wstring strProp = std::to_wstring(pPF->bulletSize.get() * 1000 ); + m_oWriter.WriteString(L""); + } + if (pPF->bulletSize.get() < 0 && pPF->bulletSize.get() > -4001) + { + std::wstring strProp = std::to_wstring(- pPF->bulletSize.get() ); + m_oWriter.WriteString(L""); + } + } + if (pPF->bulletFontProperties.is_init()) + { + m_oWriter.WriteString(std::wstring(L"bulletFontProperties->Name + L"\""); - if ( pPF->bulletFontProperties->PitchFamily > 0) - { - m_oWriter.WriteString(std::wstring(L" pitchFamily=\"") + std::to_wstring(pPF->bulletFontProperties->PitchFamily) + L"\""); - } - if ( pPF->bulletFontProperties->Charset > 0) - { - m_oWriter.WriteString(std::wstring(L" charset=\"") + std::to_wstring((char)pPF->bulletFontProperties->Charset) + L"\""); - } - m_oWriter.WriteString(std::wstring(L"/>")); - } + if ( pPF->bulletFontProperties->PitchFamily > 0) + { + m_oWriter.WriteString(std::wstring(L" pitchFamily=\"") + std::to_wstring(pPF->bulletFontProperties->PitchFamily) + L"\""); + } + if ( pPF->bulletFontProperties->Charset > 0) + { + m_oWriter.WriteString(std::wstring(L" charset=\"") + std::to_wstring((char)pPF->bulletFontProperties->Charset) + L"\""); + } + m_oWriter.WriteString(std::wstring(L"/>")); + } if (pPF->bulletAutoNum.is_init()) // TODO Numbering { m_oWriter.WriteString(L""); } - bool set = true; - if (pPF->bulletFontProperties.is_init() == false && pPF->bulletSize.is_init() == false) - { - m_oWriter.WriteString(std::wstring(L"")); - if (pPF->bulletColor.is_init() == false) - set = false; - } + bool set = true; + if (pPF->bulletFontProperties.is_init() == false && pPF->bulletSize.is_init() == false) + { + m_oWriter.WriteString(std::wstring(L"")); + if (pPF->bulletColor.is_init() == false) + set = false; + } - if (pPF->bulletChar.is_init()) - { - wchar_t bu = pPF->bulletChar.get(); - m_oWriter.WriteString(std::wstring(L"")); - set = true; - } - - if (!set) - { - wchar_t bu = 0x2022; - m_oWriter.WriteString(std::wstring(L"")); - } - } - else - { - m_oWriter.WriteString(std::wstring(L"")); - } - } + if (pPF->bulletChar.is_init()) + { + wchar_t bu = pPF->bulletChar.get(); + m_oWriter.WriteString(std::wstring(L"")); + set = true; + } - m_oWriter.WriteString(std::wstring(L"")); + if (!set) + { + wchar_t bu = 0x2022; + m_oWriter.WriteString(std::wstring(L"")); + } + } + else + { + m_oWriter.WriteString(std::wstring(L"")); + } + } - std::wstring typeRun = L"a:r"; + m_oWriter.WriteString(std::wstring(L"")); - size_t nCountSpans = pParagraph->m_arSpans.size(); - for (size_t nSpan = 0; nSpan < nCountSpans; ++nSpan) - { - if (true) - { - if ((nSpan == (nCountSpans - 1)) && (_T("\n") == pParagraph->m_arSpans[nSpan].m_strText || pParagraph->m_arSpans[nSpan].m_strText.empty()) ) - { - PPT_FORMAT::CTextCFRun* pCF = &pParagraph->m_arSpans[nSpan].m_oRun; - if ((pCF->Size.is_init()) && (pCF->Size.get() > 0) && (pCF->Size.get() < 4001)) - { + std::wstring typeRun = L"a:r"; + + size_t nCountSpans = pParagraph->m_arSpans.size(); + for (size_t nSpan = 0; nSpan < nCountSpans; ++nSpan) + { + if (true) + { + if ((nSpan == (nCountSpans - 1)) && (_T("\n") == pParagraph->m_arSpans[nSpan].m_strText || pParagraph->m_arSpans[nSpan].m_strText.empty()) ) + { + PPT_FORMAT::CTextCFRun* pCF = &pParagraph->m_arSpans[nSpan].m_oRun; + if ((pCF->Size.is_init()) && (pCF->Size.get() > 0) && (pCF->Size.get() < 4001)) + { m_oWriter.WriteString(L"Size.get())) + L"\"/>"); - } - else - { - m_oWriter.WriteString(std::wstring(L"")); - } - continue; - } - } + } + else + { + m_oWriter.WriteString(std::wstring(L"")); + } + continue; + } + } - PPT_FORMAT::CTextCFRun* pCF = &pParagraph->m_arSpans[nSpan].m_oRun; - int span_sz = pParagraph->m_arSpans[nSpan].m_strText.length() ; + PPT_FORMAT::CTextCFRun* pCF = &pParagraph->m_arSpans[nSpan].m_oRun; + int span_sz = pParagraph->m_arSpans[nSpan].m_strText.length() ; if ((span_sz==1 && ( pParagraph->m_arSpans[nSpan].m_strText[0] == (wchar_t)13 )) || - ((span_sz==2 && ( pParagraph->m_arSpans[nSpan].m_strText[0] == (wchar_t)13 ) && ( pParagraph->m_arSpans[nSpan].m_strText[1] == (wchar_t)13 )))) - { - continue; - } + ((span_sz==2 && ( pParagraph->m_arSpans[nSpan].m_strText[0] == (wchar_t)13 ) && ( pParagraph->m_arSpans[nSpan].m_strText[1] == (wchar_t)13 )))) + { + continue; + } - if (pParagraph->m_arSpans[nSpan].m_strText.empty() && !pParagraph->m_arSpans[nSpan].m_bBreak) continue; - - if (pParagraph->m_arSpans[nSpan].m_bBreak) - { - m_oWriter.WriteString(std::wstring(L"m_lPlaceholderType == PT_MasterSlideNumber/* && pParagraph->m_arSpans[nSpan].m_bField*/) - { - m_oWriter.WriteString(std::wstring(L"m_lPlaceholderType == PT_MasterDate && pShapeElement->m_nFormatDate == 1/* && pParagraph->m_arSpans[nSpan].m_bField*/) - { - m_oWriter.WriteString(std::wstring(L"Size.is_init()) && (pCF->Size.get() > 0) && (pCF->Size.get() < 4001)) - { - m_oWriter.WriteString(L" sz=\"" + std::to_wstring((int)(100 * pCF->Size.get())) + L"\""); - } - if (pCF->BaseLineOffset.is_init()) - { - m_oWriter.WriteString(L" baseline=\"" + std::to_wstring((int)(1000 * pCF->BaseLineOffset.get())) + L"\""); - } - if (pCF->FontBold.is_init()) - { - if (pCF->FontBold.get()) - m_oWriter.WriteString(std::wstring(L" b=\"1\"")); - else - m_oWriter.WriteString(std::wstring(L" b=\"0\"")); - } - if (pCF->FontItalic.is_init()) - { - if (pCF->FontItalic.get()) - m_oWriter.WriteString(std::wstring(L" i=\"1\"")); - else - m_oWriter.WriteString(std::wstring(L" i=\"0\"")); - } + if (pParagraph->m_arSpans[nSpan].m_strText.empty() && !pParagraph->m_arSpans[nSpan].m_bBreak) continue; - if (pCF->FontUnderline.is_init()) - { - if (pCF->FontUnderline.get()) - m_oWriter.WriteString(std::wstring(L" u=\"sng\"")); - else - m_oWriter.WriteString(std::wstring(L" u=\"none\"")); - } - if (pCF->Language.is_init()) - { - std::wstring str_lang = msLCID2wstring(pCF->Language.get()); - - if (str_lang.length() > 0) - m_oWriter.WriteString(std::wstring(L" lang=\"") + str_lang + _T("\"")); - } - m_oWriter.WriteString(std::wstring(L">")); - - if (m_bWordArt) - {//порядок важен - линия, заливка, тень !!! - if (pShapeElement->m_bLine) - { - m_oWriter.WriteString(ConvertLine(pShapeElement->m_oPen)); - } - m_oWriter.WriteString(ConvertBrush(pShapeElement->m_oBrush)); - m_oWriter.WriteString(ConvertShadow(pShapeElement->m_oShadow)); - } + if (pParagraph->m_arSpans[nSpan].m_bBreak) + { + m_oWriter.WriteString(std::wstring(L"Color.is_init()) - { - if (pCF->Color->m_lSchemeIndex != -1) - { + { + if (pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber/* && pParagraph->m_arSpans[nSpan].m_bField*/) + { + m_oWriter.WriteString(std::wstring(L"m_lPlaceholderType == PT_MasterDate && pShapeElement->m_nFormatDate == 1/* && pParagraph->m_arSpans[nSpan].m_bField*/) + { + m_oWriter.WriteString(std::wstring(L"Size.is_init()) && (pCF->Size.get() > 0) && (pCF->Size.get() < 4001)) + { + m_oWriter.WriteString(L" sz=\"" + std::to_wstring((int)(100 * pCF->Size.get())) + L"\""); + } + if (pCF->BaseLineOffset.is_init()) + { + m_oWriter.WriteString(L" baseline=\"" + std::to_wstring((int)(1000 * pCF->BaseLineOffset.get())) + L"\""); + } + if (pCF->FontBold.is_init()) + { + if (pCF->FontBold.get()) + m_oWriter.WriteString(std::wstring(L" b=\"1\"")); + else + m_oWriter.WriteString(std::wstring(L" b=\"0\"")); + } + if (pCF->FontItalic.is_init()) + { + if (pCF->FontItalic.get()) + m_oWriter.WriteString(std::wstring(L" i=\"1\"")); + else + m_oWriter.WriteString(std::wstring(L" i=\"0\"")); + } + + if (pCF->FontUnderline.is_init()) + { + if (pCF->FontUnderline.get()) + m_oWriter.WriteString(std::wstring(L" u=\"sng\"")); + else + m_oWriter.WriteString(std::wstring(L" u=\"none\"")); + } + if (pCF->Language.is_init()) + { + std::wstring str_lang = msLCID2wstring(pCF->Language.get()); + + if (str_lang.length() > 0) + m_oWriter.WriteString(std::wstring(L" lang=\"") + str_lang + _T("\"")); + } + m_oWriter.WriteString(std::wstring(L">")); + WriteHyperlink(pParagraph->m_arSpans[nSpan].m_arrInteractive); + + if (m_bWordArt) + {//порядок важен - линия, заливка, тень !!! + if (pShapeElement->m_bLine) + { + m_oWriter.WriteString(ConvertLine(pShapeElement->m_oPen)); + } + m_oWriter.WriteString(ConvertBrush(pShapeElement->m_oBrush)); + m_oWriter.WriteString(ConvertShadow(pShapeElement->m_oShadow)); + } + else + { + if (pCF->Color.is_init()) + { + if (pCF->Color->m_lSchemeIndex != -1) + { std::wstring strProp = _T("Color->m_lSchemeIndex) + _T("\"/>"); - m_oWriter.WriteString(strProp); - } - else - { + m_oWriter.WriteString(strProp); + } + else + { std::wstring strColor = XmlUtils::IntToString(pCF->Color->GetLONG_RGB(), L"%06x"); m_oWriter.WriteString(L""); - } - } - } + } + } + } - if (pCF->font.font.is_init()) - { - m_oWriter.WriteString(std::wstring(L"font.font->Name + _T("\"/>")); - } - else if (pCF->fontRef.is_init()) - { - if ((m_pTheme) && (pCF->fontRef.get() < m_pTheme->m_arFonts.size())) - { - m_oWriter.WriteString(L"m_arFonts[pCF->fontRef.get()].Name + L"\"/>"); - } - else - { - if (0 == pCF->fontRef.get()) - { - m_oWriter.WriteString(L""); - } - else - { - m_oWriter.WriteString(L""); - } - } - } + if (pCF->font.font.is_init()) + { + m_oWriter.WriteString(std::wstring(L"font.font->Name + _T("\"/>")); + } + else if (pCF->fontRef.is_init()) + { + if ((m_pTheme) && (pCF->fontRef.get() < m_pTheme->m_arFonts.size())) + { + m_oWriter.WriteString(L"m_arFonts[pCF->fontRef.get()].Name + L"\"/>"); + } + else + { + if (0 == pCF->fontRef.get()) + { + m_oWriter.WriteString(L""); + } + else + { + m_oWriter.WriteString(L""); + } + } + } - if (pCF->font.ea.is_init()) - { - m_oWriter.WriteString(std::wstring(L"font.ea->Name + L"\"/>"); - } - if (pCF->font.sym.is_init()) - { - m_oWriter.WriteString(std::wstring(L"font.sym->Name + _T("\"/>")); - } + if (pCF->font.ea.is_init()) + { + m_oWriter.WriteString(std::wstring(L"font.ea->Name + L"\"/>"); + } + if (pCF->font.sym.is_init()) + { + m_oWriter.WriteString(std::wstring(L"font.sym->Name + _T("\"/>")); + } - WriteButton(nIndexPar); +// WriteHyperlink(nIndexPar); m_oWriter.WriteString(std::wstring(L"")); - if (pParagraph->m_arSpans[nSpan].m_bBreak) - { - m_oWriter.WriteString(std::wstring(L"")); - } - else - { + if (pParagraph->m_arSpans[nSpan].m_bBreak) + { + m_oWriter.WriteString(std::wstring(L"")); + } + else + { std::wstring strT1 = _T(""); - m_oWriter.WriteString(strT1); + m_oWriter.WriteString(strT1); - std::wstring strT = pParagraph->m_arSpans[nSpan].m_strText; - CorrectXmlString(strT); - m_oWriter.WriteString(strT); + std::wstring strT = pParagraph->m_arSpans[nSpan].m_strText; + CorrectXmlString(strT); + m_oWriter.WriteString(strT); std::wstring strT2 = _T(""); - m_oWriter.WriteString(strT2); - - if ((pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber || - (pShapeElement->m_lPlaceholderType == PT_MasterDate && pShapeElement->m_nFormatDate == 1))/* && pParagraph->m_arSpans[nSpan].m_bField*/) - { - m_oWriter.WriteString(std::wstring(L"")); - } - else - m_oWriter.WriteString(std::wstring(L"")); - } - } + m_oWriter.WriteString(strT2); + + if ((pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber || + (pShapeElement->m_lPlaceholderType == PT_MasterDate && pShapeElement->m_nFormatDate == 1))/* && pParagraph->m_arSpans[nSpan].m_bField*/) + { + m_oWriter.WriteString(std::wstring(L"")); + } + else + m_oWriter.WriteString(std::wstring(L"")); + } + } std::wstring strEndPar = _T(""); - m_oWriter.WriteString(strEndPar); - } + m_oWriter.WriteString(strEndPar); + } std::wstring str5 = _T(""); - m_oWriter.WriteString(str5); + m_oWriter.WriteString(str5); } std::wstring PPT_FORMAT::CShapeWriter::ConvertGroup() { - CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); - if (!pGroupElement) return L""; + CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); + if (!pGroupElement) return L""; - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - WriteGroupInfo(); - - m_pElement->NormalizeCoordsByMetric(); + WriteGroupInfo(); - m_oWriter.WriteString(std::wstring(L"")); + m_pElement->NormalizeCoordsByMetric(); - if (pGroupElement->m_bChildAnchorEnabled || pGroupElement->m_bAnchorEnabled) - { + m_oWriter.WriteString(std::wstring(L"")); + + if (pGroupElement->m_bChildAnchorEnabled || pGroupElement->m_bAnchorEnabled) + { std::wstring str; - - m_oWriter.WriteString(std::wstring(L"m_dRotate) - { - if (pGroupElement->m_bFlipH && pGroupElement->m_dRotate < 180) - pGroupElement->m_dRotate += 180; //Тікбұрышты үшбұрыштарды.ppt slide-7 - m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pGroupElement->m_dRotate * 60000)) + L"\""); - } - if (pGroupElement->m_bFlipH) - { - m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); - } - if (pGroupElement->m_bFlipV) - { - m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); - } - m_oWriter.WriteString(std::wstring(L">")); + m_oWriter.WriteString(std::wstring(L"m_dRotate) + { + if (pGroupElement->m_bFlipH && pGroupElement->m_dRotate < 180) + pGroupElement->m_dRotate += 180; //Тікбұрышты үшбұрыштарды.ppt slide-7 - m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.left : (int)pGroupElement->m_rcAnchor.left) - + L"\" y=\"" + - std::to_wstring(pGroupElement->m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.top : (int)pGroupElement->m_rcAnchor.top) + - L"\"/>"); + m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pGroupElement->m_dRotate * 60000)) + L"\""); + } + if (pGroupElement->m_bFlipH) + { + m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); + } + if (pGroupElement->m_bFlipV) + { + m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); + } + m_oWriter.WriteString(std::wstring(L">")); - double width = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetWidth() : pGroupElement->m_rcAnchor.GetWidth(); - double height = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetHeight() : pGroupElement->m_rcAnchor.GetHeight(); + m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.left : (int)pGroupElement->m_rcAnchor.left) + + L"\" y=\"" + + std::to_wstring(pGroupElement->m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.top : (int)pGroupElement->m_rcAnchor.top) + + L"\"/>"); - if ( width > 0 || height > 0 ) - { + double width = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetWidth() : pGroupElement->m_rcAnchor.GetWidth(); + double height = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetHeight() : pGroupElement->m_rcAnchor.GetHeight(); + + if ( width > 0 || height > 0 ) + { m_oWriter.WriteString(L""); - } + } - m_oWriter.WriteString(L"m_rcGroupAnchor.left) + - L"\" y=\"" + std::to_wstring((int)pGroupElement->m_rcGroupAnchor.top) + L"\"/>"); - m_oWriter.WriteString(L"m_rcGroupAnchor.GetWidth()) + - L"\" cy=\"" + std::to_wstring((int)pGroupElement->m_rcGroupAnchor.GetHeight()) + L"\"/>"); + m_oWriter.WriteString(L"m_rcGroupAnchor.left) + + L"\" y=\"" + std::to_wstring((int)pGroupElement->m_rcGroupAnchor.top) + L"\"/>"); + m_oWriter.WriteString(L"m_rcGroupAnchor.GetWidth()) + + L"\" cy=\"" + std::to_wstring((int)pGroupElement->m_rcGroupAnchor.GetHeight()) + L"\"/>"); - m_oWriter.WriteString(std::wstring(L"")); - } + m_oWriter.WriteString(std::wstring(L"")); + } - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - pGroupElement = NULL; + pGroupElement = NULL; - return m_oWriter.GetData(); + return m_oWriter.GetData(); } -void PPT_FORMAT::CShapeWriter::WriteButton(int paragraphNum) +void PPT_FORMAT::CShapeWriter::WriteHyperlink(const std::vector& actions) { - auto actions = getActionsByNum(paragraphNum); for (unsigned i = 0; i < actions.size(); i++) { if (actions[i].m_lType == CInteractiveInfo::over @@ -1700,8 +1697,16 @@ void PPT_FORMAT::CShapeWriter::WriteButton(int paragraphNum) PPTX::Logic::Hyperlink hlink; if (actions[i].m_strHyperlink.size() && m_pRels) { - std::wstring id = m_pRels->WriteSlideRef(actions[i].m_strHyperlink); - hlink.id = id; + std::wstring id; + switch (actions[i].m_lHyperlinkType) + { + case LT_SlideNumber: id = m_pRels->WriteSlideRef(actions[i].m_strHyperlink); break; + case LT_Url: id = m_pRels->WriteHyperlink(actions[i].m_strHyperlink, true); break; + case LT_OtherPresentation: id = m_pRels->WriteFile(actions[i].m_strHyperlink); break; + case LT_OtherFile: id = m_pRels->WriteFile(actions[i].m_strHyperlink); break; + } + if (!id.empty()) + hlink.id = id; } if (actions[i].m_strAudioFileName.size() && m_pRels) @@ -1715,8 +1720,9 @@ void PPT_FORMAT::CShapeWriter::WriteButton(int paragraphNum) if (actions[i].m_eActivation == CInteractiveInfo::over) hlink.m_name = L"hlinkHover"; - else - hlink.highlightClick = true; + +// if (actions[i].m_bVisited) +// hlink.highlightClick = true; switch (actions[i].m_lType) { @@ -1725,6 +1731,15 @@ void PPT_FORMAT::CShapeWriter::WriteButton(int paragraphNum) hlink.action = L"ppaction://noaction"; break; } + case II_MacroAction: + { + if (actions[i].m_macro.size()) + hlink.action = L"ppaction://macro?name=" + actions[i].m_macro; + else + hlink.action = L"ppaction://noaction"; + + break; + } case II_JumpAction: { std::wstring strJump(L"ppaction://hlinkshowjump?jump="); @@ -1767,15 +1782,42 @@ void PPT_FORMAT::CShapeWriter::WriteButton(int paragraphNum) } case II_HyperlinkAction: { - if (hlink.id.is_init()) - hlink.action = L"ppaction://hlinksldjump"; - else - hlink.action = L"ppaction://noaction"; + + switch (actions[i].m_lHyperlinkType) + { + case LT_SlideNumber: + { + if (hlink.id.is_init()) + hlink.action = L"ppaction://hlinksldjump"; + break; + } + case LT_Url: + { + break; + } + case LT_OtherPresentation: + { + if (hlink.id.is_init()) + hlink.action = L"ppaction://hlinkpres?slideindex=1&slidetitle="; + break; + } + case LT_OtherFile: + { + break; + } + } + + break; + } + case II_MediaAction: + { + + hlink.action = L"ppaction://media"; break; } default: hlink.action = L"ppaction://noaction"; - } + } m_oWriter.WriteString(hlink.toXML()); } @@ -1783,10 +1825,7 @@ void PPT_FORMAT::CShapeWriter::WriteButton(int paragraphNum) std::vector CShapeWriter::getActionsByNum(const int num) { - CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); - if (!pShapeElement) return {}; - - auto& actions = pShapeElement->m_arrActions; + auto& actions = m_pElement->m_arrActions; // Need to check paragraph or button if (num == -1 && actions.size() > 2) // paragraph inside shape @@ -1836,28 +1875,28 @@ std::wstring PPT_FORMAT::CShapeWriter::ConvertTable () std::wstring str; m_oWriter.WriteString(std::wstring(L"m_dRotate) - { - if (pGroupElement->m_bFlipH && pGroupElement->m_dRotate < 180) - pGroupElement->m_dRotate += 180; //Тікбұрышты үшбұрыштарды.ppt slide-7 + if (0 != pGroupElement->m_dRotate) + { + if (pGroupElement->m_bFlipH && pGroupElement->m_dRotate < 180) + pGroupElement->m_dRotate += 180; //Тікбұрышты үшбұрыштарды.ppt slide-7 - m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pGroupElement->m_dRotate * 60000)) + L"\""); - } - if (pGroupElement->m_bFlipH) - { - m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); - } - if (pGroupElement->m_bFlipV) - { - m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); - } + m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pGroupElement->m_dRotate * 60000)) + L"\""); + } + if (pGroupElement->m_bFlipH) + { + m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); + } + if (pGroupElement->m_bFlipV) + { + m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); + } m_oWriter.WriteString(std::wstring(L">")); m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.left : (int)pGroupElement->m_rcAnchor.left) - + L"\" y=\"" + - std::to_wstring(pGroupElement->m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.top : (int)pGroupElement->m_rcAnchor.top) + - L"\"/>"); + std::to_wstring(pGroupElement->m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.left : (int)pGroupElement->m_rcAnchor.left) + + L"\" y=\"" + + std::to_wstring(pGroupElement->m_bChildAnchorEnabled ? (int)pGroupElement->m_rcChildAnchor.top : (int)pGroupElement->m_rcAnchor.top) + + L"\"/>"); double width = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetWidth() : pGroupElement->m_rcAnchor.GetWidth(); double height = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetHeight() : pGroupElement->m_rcAnchor.GetHeight(); @@ -1890,1102 +1929,1102 @@ std::wstring PPT_FORMAT::CShapeWriter::ConvertTableCells() std::wstring PPT_FORMAT::CShapeWriter::ConvertShape() { - CImageElement* pImageElement = dynamic_cast(m_pElement.get()); - CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); - CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); + CImageElement* pImageElement = dynamic_cast(m_pElement.get()); + CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); + CShapeElement* pShapeElement = dynamic_cast(m_pElement.get()); - if (pImageElement) return ConvertImage(); - if (pGroupElement) return ConvertGroup(); + if (pImageElement) return ConvertImage(); + if (pGroupElement) return ConvertGroup(); - if (pShapeElement == NULL) return _T(""); + if (pShapeElement == NULL) return _T(""); - std::wstring prstTxWarp; - std::wstring prstGeom = oox::Spt2ShapeType_mini((oox::MSOSPT)pShapeElement->m_lShapeType); -//rect, ellipse, line + std::wstring prstTxWarp; + std::wstring prstGeom = oox::Spt2ShapeType_mini((oox::MSOSPT)pShapeElement->m_lShapeType); + //rect, ellipse, line - if (prstGeom.empty()) - { - prstTxWarp = oox::Spt2WordArtShapeType((oox::MSOSPT)pShapeElement->m_lShapeType); - if (prstTxWarp.empty() == false) - { - m_bWordArt = true; - m_bTextBox = true; - prstGeom = L"rect"; - m_oBrush.Type = c_BrushTypeNoFill; - } - } - else - { - if (oox::msosptTextBox == (oox::MSOSPT)pShapeElement->m_lShapeType) - m_bTextBox = true; - if (oox::msosptLine == (oox::MSOSPT)pShapeElement->m_lShapeType) - pShapeElement->m_bLine = true; - } + if (prstGeom.empty()) + { + prstTxWarp = oox::Spt2WordArtShapeType((oox::MSOSPT)pShapeElement->m_lShapeType); + if (prstTxWarp.empty() == false) + { + m_bWordArt = true; + m_bTextBox = true; + prstGeom = L"rect"; + m_oBrush.Type = c_BrushTypeNoFill; + } + } + else + { + if (oox::msosptTextBox == (oox::MSOSPT)pShapeElement->m_lShapeType) + m_bTextBox = true; + if (oox::msosptLine == (oox::MSOSPT)pShapeElement->m_lShapeType) + pShapeElement->m_bLine = true; + } - if (pShapeElement->m_pShape && !pShapeElement->m_pShape->m_strXmlString.empty()) - { - ParseXmlAlternative(pShapeElement->m_pShape->m_strXmlString); - } + if (pShapeElement->m_pShape && !pShapeElement->m_pShape->m_strXmlString.empty()) + { + ParseXmlAlternative(pShapeElement->m_pShape->m_strXmlString); + } - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - WriteShapeInfo(); + WriteShapeInfo(); - CGeomShapeInfo oInfo; + CGeomShapeInfo oInfo; - oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); + oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); oInfo.m_lOriginalHeight = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetHeight() : (LONG)m_pElement->m_rcAnchor.GetHeight(); - m_pElement->NormalizeCoordsByMetric(); - oInfo.SetBounds(m_pElement->m_bChildAnchorEnabled ? m_pElement->m_rcChildAnchor : m_pElement->m_rcAnchor); - - oInfo.m_dRotate = pShapeElement->m_dRotate; - oInfo.m_bFlipH = pShapeElement->m_bFlipH; - oInfo.m_bFlipV = pShapeElement->m_bFlipV; + m_pElement->NormalizeCoordsByMetric(); + oInfo.SetBounds(m_pElement->m_bChildAnchorEnabled ? m_pElement->m_rcChildAnchor : m_pElement->m_rcAnchor); - m_oWriter.WriteString(std::wstring(L"")); + oInfo.m_dRotate = pShapeElement->m_dRotate; + oInfo.m_bFlipH = pShapeElement->m_bFlipH; + oInfo.m_bFlipV = pShapeElement->m_bFlipV; - if (pShapeElement->m_bChildAnchorEnabled || pShapeElement->m_bAnchorEnabled) - { + m_oWriter.WriteString(std::wstring(L"")); + + if (pShapeElement->m_bChildAnchorEnabled || pShapeElement->m_bAnchorEnabled) + { std::wstring str; - - m_oWriter.WriteString(std::wstring(L"m_dRotate) - { - if (pShapeElement->m_bFlipH && pShapeElement->m_dRotate < 180) - pShapeElement->m_dRotate += 180; //Тікбұрышты үшбұрыштарды.ppt slide-7 - m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pShapeElement->m_dRotate * 60000)) + L"\""); - } - if (pShapeElement->m_bFlipH) - { - m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); - } - if (pShapeElement->m_bFlipV) - { - m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); - } - m_oWriter.WriteString(std::wstring(L">")); + m_oWriter.WriteString(std::wstring(L"m_dRotate) + { + if (pShapeElement->m_bFlipH && pShapeElement->m_dRotate < 180) + pShapeElement->m_dRotate += 180; //Тікбұрышты үшбұрыштарды.ppt slide-7 - m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pShapeElement->m_rcChildAnchor.left : (int)pShapeElement->m_rcAnchor.left) - + L"\" y=\"" + - std::to_wstring(pShapeElement->m_bChildAnchorEnabled ? (int)pShapeElement->m_rcChildAnchor.top : (int)pShapeElement->m_rcAnchor.top) + - L"\"/>"); + m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pShapeElement->m_dRotate * 60000)) + L"\""); + } + if (pShapeElement->m_bFlipH) + { + m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); + } + if (pShapeElement->m_bFlipV) + { + m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); + } + m_oWriter.WriteString(std::wstring(L">")); - double width = pShapeElement->m_bChildAnchorEnabled ? pShapeElement->m_rcChildAnchor.GetWidth() : pShapeElement->m_rcAnchor.GetWidth(); - double height = pShapeElement->m_bChildAnchorEnabled ? pShapeElement->m_rcChildAnchor.GetHeight() : pShapeElement->m_rcAnchor.GetHeight(); + m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pShapeElement->m_rcChildAnchor.left : (int)pShapeElement->m_rcAnchor.left) + + L"\" y=\"" + + std::to_wstring(pShapeElement->m_bChildAnchorEnabled ? (int)pShapeElement->m_rcChildAnchor.top : (int)pShapeElement->m_rcAnchor.top) + + L"\"/>"); - if ( width > 0 || height > 0 ) - { + double width = pShapeElement->m_bChildAnchorEnabled ? pShapeElement->m_rcChildAnchor.GetWidth() : pShapeElement->m_rcAnchor.GetWidth(); + double height = pShapeElement->m_bChildAnchorEnabled ? pShapeElement->m_rcChildAnchor.GetHeight() : pShapeElement->m_rcAnchor.GetHeight(); + + if ( width > 0 || height > 0 ) + { m_oWriter.WriteString(L""); - } - m_oWriter.WriteString(std::wstring(L"")); - } + } + m_oWriter.WriteString(std::wstring(L"")); + } CBaseShapePtr shape = pShapeElement->m_pShape->getBaseShape(); - if (pShapeElement->m_pShape->m_lDrawType & c_ShapeDrawType_Graphic || shape->m_bCustomShape) - { - pShapeElement->m_pShape->ToRenderer(dynamic_cast(this), oInfo, 0.0, 1.0); - } + if (pShapeElement->m_pShape->m_lDrawType & c_ShapeDrawType_Graphic || shape->m_bCustomShape) + { + pShapeElement->m_pShape->ToRenderer(dynamic_cast(this), oInfo, 0.0, 1.0); + } - if (!m_xmlGeomAlternative.empty()) - { - m_oWriter.WriteString(m_xmlGeomAlternative); - } - else - { - if ((prstGeom.empty() == false || pShapeElement->m_bShapePreset) && prstTxWarp.empty() && !shape->m_bCustomShape) - { - if (prstGeom.empty()) prstGeom = L"rect"; - m_oWriter.WriteString(std::wstring(L"")); - if (!m_bWordArt) - { - m_oWriter.WriteString(std::wstring(L"")); - } - } - m_oWriter.WriteString(std::wstring(L"")); - } - else if (prstTxWarp.empty()) - { - m_oWriter.WriteString(pShapeElement->ConvertPPTShapeToPPTX()); - } - else - { - //word art - m_oWriter.WriteString(std::wstring(L"")); - } - } + if (!m_xmlGeomAlternative.empty()) + { + m_oWriter.WriteString(m_xmlGeomAlternative); + } + else + { + if ((prstGeom.empty() == false || pShapeElement->m_bShapePreset) && prstTxWarp.empty() && !shape->m_bCustomShape) + { + if (prstGeom.empty()) prstGeom = L"rect"; + m_oWriter.WriteString(std::wstring(L"")); + if (!m_bWordArt) + { + m_oWriter.WriteString(std::wstring(L"")); + } + } + m_oWriter.WriteString(std::wstring(L"")); + } + else if (prstTxWarp.empty()) + { + m_oWriter.WriteString(pShapeElement->ConvertPPTShapeToPPTX()); + } + else + { + //word art + m_oWriter.WriteString(std::wstring(L"")); + } + } - if (!m_bWordArt) - { - m_oWriter.WriteString(ConvertBrush(pShapeElement->m_oBrush)); - if (pShapeElement->m_bLine) - { - m_oWriter.WriteString(ConvertLine(pShapeElement->m_oPen)); - } - m_oWriter.WriteString(ConvertShadow(pShapeElement->m_oShadow)); - } - Write3dShape(); + if (!m_bWordArt) + { + m_oWriter.WriteString(ConvertBrush(pShapeElement->m_oBrush)); + if (pShapeElement->m_bLine) + { + m_oWriter.WriteString(ConvertLine(pShapeElement->m_oPen)); + } + m_oWriter.WriteString(ConvertShadow(pShapeElement->m_oShadow)); + } + Write3dShape(); - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - WriteTextInfo(); - m_oWriter.WriteString(std::wstring(L"")); + WriteTextInfo(); + m_oWriter.WriteString(std::wstring(L"")); - pShapeElement = NULL; + pShapeElement = NULL; - return m_oWriter.GetData(); + return m_oWriter.GetData(); } void PPT_FORMAT::CShapeWriter::ParseXmlAlternative(const std::wstring & xml) { - XmlUtils::CXmlLiteReader oReader; + XmlUtils::CXmlLiteReader oReader; - if ( !oReader.FromString( xml ) ) - return; - if ( !oReader.ReadNextNode() ) - return; + if ( !oReader.FromString( xml ) ) + return; + if ( !oReader.ReadNextNode() ) + return; - std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - nullable oElement; + nullable oElement; - if ( L"graphicFrame" == sName || L"pic" == sName || L"sp" == sName || L"grpSp" == sName || L"cxnSp" == sName || L"AlternateContent" == sName - || L"spTree" ) - { - oElement = oReader; - } + if ( L"graphicFrame" == sName || L"pic" == sName || L"sp" == sName || L"grpSp" == sName || L"cxnSp" == sName || L"AlternateContent" == sName + || L"spTree" ) + { + oElement = oReader; + } - if (oElement.IsInit()) - { - smart_ptr shape = oElement->GetElem().smart_dynamic_cast(); - if (shape.IsInit()) - { - NSBinPptxRW::CXmlWriter writer(XMLWRITER_DOC_TYPE_PPTX); - shape->spPr.Geometry.toXmlWriter(&writer); + if (oElement.IsInit()) + { + smart_ptr shape = oElement->GetElem().smart_dynamic_cast(); + if (shape.IsInit()) + { + NSBinPptxRW::CXmlWriter writer(XMLWRITER_DOC_TYPE_PPTX); + shape->spPr.Geometry.toXmlWriter(&writer); - if (shape->spPr.scene3d.IsInit()) - shape->spPr.scene3d->toXmlWriter(&writer); - - if (shape->spPr.sp3d.IsInit()) - shape->spPr.sp3d->toXmlWriter(&writer); + if (shape->spPr.scene3d.IsInit()) + shape->spPr.scene3d->toXmlWriter(&writer); - m_xmlGeomAlternative = writer.GetXmlString(); + if (shape->spPr.sp3d.IsInit()) + shape->spPr.sp3d->toXmlWriter(&writer); - writer.ClearNoAttack(); - if ((shape->txBody.IsInit()) && (shape->txBody->bodyPr.IsInit()) && (shape->txBody->bodyPr->prstTxWarp.IsInit())) - {//только WordArt - shape->txBody->toXmlWriter(&writer); - m_xmlTxBodyAlternative = writer.GetXmlString(); - } - } - smart_ptr groupShape = oElement->GetElem().smart_dynamic_cast(); - if (groupShape.IsInit()) - {//smartArt - NSBinPptxRW::CXmlWriter writer(XMLWRITER_DOC_TYPE_PPTX); - groupShape->toXmlWriter(&writer); + m_xmlGeomAlternative = writer.GetXmlString(); - m_xmlAlternative = writer.GetXmlString(); - } - } + writer.ClearNoAttack(); + if ((shape->txBody.IsInit()) && (shape->txBody->bodyPr.IsInit()) && (shape->txBody->bodyPr->prstTxWarp.IsInit())) + {//только WordArt + shape->txBody->toXmlWriter(&writer); + m_xmlTxBodyAlternative = writer.GetXmlString(); + } + } + smart_ptr groupShape = oElement->GetElem().smart_dynamic_cast(); + if (groupShape.IsInit()) + {//smartArt + NSBinPptxRW::CXmlWriter writer(XMLWRITER_DOC_TYPE_PPTX); + groupShape->toXmlWriter(&writer); + + m_xmlAlternative = writer.GetXmlString(); + } + } } std::wstring PPT_FORMAT::CShapeWriter::ConvertImage() { - CImageElement* pImageElement = dynamic_cast(m_pElement.get()); - if (!pImageElement) return L""; + CImageElement* pImageElement = dynamic_cast(m_pElement.get()); + if (!pImageElement) return L""; - if (pImageElement->m_bImagePresent == false) - { - if (pImageElement->m_sName.empty()) return _T(""); - //ppt_presentation.ppt - ссылка на файл на диске + if (pImageElement->m_bImagePresent == false) + { + if (pImageElement->m_sName.empty()) return _T(""); + //ppt_presentation.ppt - ссылка на файл на диске - pImageElement->m_strImageFileName.clear(); - pImageElement->m_bImagePresent = true; - } + pImageElement->m_strImageFileName.clear(); + pImageElement->m_bImagePresent = true; + } std::wstring strRid; - if (!pImageElement->m_strImageFileName.empty()) - { - strRid = m_pRels->WriteImage(pImageElement->m_strImageFileName); - } - else if (!pImageElement->m_sImageName.empty()) - { - strRid = m_pRels->WriteHyperlinkImage(CorrectXmlString3(pImageElement->m_sImageName)); - } - - if (strRid.empty()) return _T(""); + if (!pImageElement->m_strImageFileName.empty()) + { + strRid = m_pRels->WriteImage(pImageElement->m_strImageFileName); + } + else if (!pImageElement->m_sImageName.empty()) + { + strRid = m_pRels->WriteHyperlinkImage(CorrectXmlString3(pImageElement->m_sImageName)); + } - m_oWriter.WriteString(std::wstring(L"")); + if (strRid.empty()) return _T(""); - WriteImageInfo(); + m_oWriter.WriteString(std::wstring(L"")); - CGeomShapeInfo oInfo; + WriteImageInfo(); - oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); + CGeomShapeInfo oInfo; + + oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); oInfo.m_lOriginalHeight = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetHeight() : (LONG)m_pElement->m_rcAnchor.GetHeight(); - m_pElement->NormalizeCoordsByMetric(); - oInfo.SetBounds(m_pElement->m_bChildAnchorEnabled ? m_pElement->m_rcChildAnchor : m_pElement->m_rcAnchor); - - oInfo.m_dRotate = pImageElement->m_dRotate; - oInfo.m_bFlipH = pImageElement->m_bFlipH; - oInfo.m_bFlipV = pImageElement->m_bFlipV; + m_pElement->NormalizeCoordsByMetric(); + oInfo.SetBounds(m_pElement->m_bChildAnchorEnabled ? m_pElement->m_rcChildAnchor : m_pElement->m_rcAnchor); - m_oWriter.WriteString(std::wstring(L"")); - - std::wstring strWrite = _T(""); - m_oWriter.WriteString(strWrite); + oInfo.m_dRotate = pImageElement->m_dRotate; + oInfo.m_bFlipH = pImageElement->m_bFlipH; + oInfo.m_bFlipV = pImageElement->m_bFlipV; - m_oWriter.WriteString(std::wstring(L"m_bCropEnabled) - {//124-125 Q3 V2 Win File 3.ppt - m_oWriter.WriteString(L" l=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromLeft *1.5)) + L"\""); - m_oWriter.WriteString(L" t=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromTop *1.5)) + L"\""); - m_oWriter.WriteString(L" r=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromRight *1.5)) + L"\""); - m_oWriter.WriteString(L" b=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromBottom*1.5)) + L"\""); - } - m_oWriter.WriteString(std::wstring(L"/>")); - - if (pImageElement->m_bTile) - { - m_oWriter.WriteString(std::wstring(L"")); - } - else if (pImageElement->m_bStretch) - { - m_oWriter.WriteString(std::wstring(L"")); - } + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"")); + std::wstring strWrite = _T(""); + m_oWriter.WriteString(strWrite); - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"m_bCropEnabled) + {//124-125 Q3 V2 Win File 3.ppt + m_oWriter.WriteString(L" l=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromLeft *1.5)) + L"\""); + m_oWriter.WriteString(L" t=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromTop *1.5)) + L"\""); + m_oWriter.WriteString(L" r=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromRight *1.5)) + L"\""); + m_oWriter.WriteString(L" b=\"" + std::to_wstring((_INT64)(pImageElement->m_lcropFromBottom*1.5)) + L"\""); + } + m_oWriter.WriteString(std::wstring(L"/>")); - if (pImageElement->m_bChildAnchorEnabled || pImageElement->m_bAnchorEnabled) - { + if (pImageElement->m_bTile) + { + m_oWriter.WriteString(std::wstring(L"")); + } + else if (pImageElement->m_bStretch) + { + m_oWriter.WriteString(std::wstring(L"")); + } + + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); + + if (pImageElement->m_bChildAnchorEnabled || pImageElement->m_bAnchorEnabled) + { std::wstring str; - - m_oWriter.WriteString(std::wstring(L"m_dRotate) - { - m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pImageElement->m_dRotate * 60000)) + L"\""); - } - if (pImageElement->m_bFlipH) - { - m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); - } - if (pImageElement->m_bFlipV) - { - m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); - } - m_oWriter.WriteString(std::wstring(L">")); - m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.left : (int)pImageElement->m_rcAnchor.left) - + L"\" y=\"" + - std::to_wstring(pImageElement->m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.top : (int)pImageElement->m_rcAnchor.top) + - L"\"/>"); + m_oWriter.WriteString(std::wstring(L"m_dRotate) + { + m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pImageElement->m_dRotate * 60000)) + L"\""); + } + if (pImageElement->m_bFlipH) + { + m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); + } + if (pImageElement->m_bFlipV) + { + m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); + } + m_oWriter.WriteString(std::wstring(L">")); - double width = pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetWidth() : pImageElement->m_rcAnchor.GetWidth(); - double height = pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetHeight() : pImageElement->m_rcAnchor.GetHeight(); - - if ( width > 0 || height > 0 ) - { + m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.left : (int)pImageElement->m_rcAnchor.left) + + L"\" y=\"" + + std::to_wstring(pImageElement->m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.top : (int)pImageElement->m_rcAnchor.top) + + L"\"/>"); + + double width = pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetWidth() : pImageElement->m_rcAnchor.GetWidth(); + double height = pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetHeight() : pImageElement->m_rcAnchor.GetHeight(); + + if ( width > 0 || height > 0 ) + { m_oWriter.WriteString(L""); - } - m_oWriter.WriteString(std::wstring(L"")); - } - m_oWriter.WriteString(std::wstring(L"")); + } + m_oWriter.WriteString(std::wstring(L"")); + } + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(ConvertBrush(pImageElement->m_oBrush)); + m_oWriter.WriteString(ConvertBrush(pImageElement->m_oBrush)); - if (pImageElement->m_bLine) - { - m_oWriter.WriteString(ConvertLine(pImageElement->m_oPen)); - } + if (pImageElement->m_bLine) + { + m_oWriter.WriteString(ConvertLine(pImageElement->m_oPen)); + } - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); - m_oWriter.WriteString(std::wstring(L"")); - - pImageElement = NULL; - return m_oWriter.GetData(); + m_oWriter.WriteString(std::wstring(L"")); + + pImageElement = NULL; + return m_oWriter.GetData(); } HRESULT PPT_FORMAT::CShapeWriter::get_Type(LONG* lType) { - if (NULL == lType) + if (NULL == lType) return S_FALSE; - *lType = c_nSVGConverter; - return S_OK; + *lType = c_nSVGConverter; + return S_OK; } //-------- Функции для работы со страницей -------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::NewPage() { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_Height(double* dHeight) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_Height(const double& dHeight) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_Width(double* dWidth) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_Width(const double& dWidth) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_DpiX(double* dDpiX) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_DpiY(double* dDpiY) { - return S_OK; + return S_OK; } // pen -------------------------------------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::SetPen(std::wstring bsXML) { //m_oPen.FromXmlString((std::wstring)bsXML); - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenColor(LONG* lColor) { - *lColor = m_oPen.Color.GetLONG(); - return S_OK; + *lColor = m_oPen.Color.GetLONG(); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenColor(const LONG& lColor) { - BYTE lScheme = ((_UINT32)(lColor)) >> 24; + BYTE lScheme = ((_UINT32)(lColor)) >> 24; - if (0xFF != lScheme) - m_oPen.Color.SetBGR(lColor); - return S_OK; + if (0xFF != lScheme) + m_oPen.Color.SetBGR(lColor); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenAlpha(LONG* lAlpha) { - *lAlpha = m_oPen.Alpha; - return S_OK; + *lAlpha = m_oPen.Alpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenAlpha(const LONG& lAlpha) { - m_oPen.Alpha = lAlpha; - return S_OK; + m_oPen.Alpha = lAlpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenSize(double* dSize) { - *dSize = m_oPen.Size; - return S_OK; + *dSize = m_oPen.Size; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenSize(const double& dSize) { - m_oPen.Size = (long)(dSize * 25.4 / 96.0); - return S_OK; + m_oPen.Size = (long)(dSize * 25.4 / 96.0); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenDashStyle(BYTE* val) { - *val = m_oPen.DashStyle; - return S_OK; + *val = m_oPen.DashStyle; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenDashStyle(const BYTE& val) { - m_oPen.DashStyle = val; - return S_OK; + m_oPen.DashStyle = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenLineStartCap(BYTE* val) { - *val = m_oPen.LineStartCap; - return S_OK; + *val = m_oPen.LineStartCap; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenLineStartCap(const BYTE& val) { - m_oPen.LineStartCap = val; - return S_OK; + m_oPen.LineStartCap = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenLineEndCap(BYTE* val) { - *val = m_oPen.LineEndCap; - return S_OK; + *val = m_oPen.LineEndCap; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenLineEndCap(const BYTE& val) { - m_oPen.LineEndCap = val; - return S_OK; + m_oPen.LineEndCap = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenLineJoin(BYTE* val) { - *val = m_oPen.LineJoin; - return S_OK; + *val = m_oPen.LineJoin; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenLineJoin(const BYTE& val) { - m_oPen.LineJoin = val; - return S_OK; + m_oPen.LineJoin = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenDashOffset(double* val) { - *val = m_oPen.DashOffset; - return S_OK; + *val = m_oPen.DashOffset; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenDashOffset(const double& val) { - m_oPen.DashOffset = val; - return S_OK; + m_oPen.DashOffset = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenAlign(LONG* val) { - *val = m_oPen.Align; - return S_OK; + *val = m_oPen.Align; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenAlign(const LONG& val) { - m_oPen.Align = val; - return S_OK; + m_oPen.Align = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_PenMiterLimit(double* val) { - *val = m_oPen.MiterLimit; - return S_OK; + *val = m_oPen.MiterLimit; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_PenMiterLimit(const double& val) { - m_oPen.MiterLimit = val; - return S_OK; + m_oPen.MiterLimit = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PenDashPattern(double* pPattern, LONG lCount) { - if (NULL != pPattern) - { - m_oPen.SetDashPattern(pPattern, lCount); - } + if (NULL != pPattern) + { + m_oPen.SetDashPattern(pPattern, lCount); + } - return S_OK; + return S_OK; } // brush ------------------------------------------------------------------------------------ HRESULT PPT_FORMAT::CShapeWriter::SetBrush(std::wstring bsXML) { //m_oBrush.FromXmlString((std::wstring)bsXML); - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushType(LONG* lType) { - *lType = m_oBrush.Type; - return S_OK; + *lType = m_oBrush.Type; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushType(const LONG& lType) { - m_oBrush.Type = lType; - return S_OK; + m_oBrush.Type = lType; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushColor1(LONG* lColor) { - *lColor = m_oBrush.Color1.GetLONG(); - return S_OK; + *lColor = m_oBrush.Color1.GetLONG(); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushColor1(const LONG& lColor) { - BYTE lScheme = ((_UINT32)(lColor)) >> 24; + BYTE lScheme = ((_UINT32)(lColor)) >> 24; - if (0xFF != lScheme) - m_oBrush.Color1.SetBGR(lColor); - return S_OK; + if (0xFF != lScheme) + m_oBrush.Color1.SetBGR(lColor); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushAlpha1(LONG* lAlpha) { - *lAlpha = m_oBrush.Alpha1; - return S_OK; + *lAlpha = m_oBrush.Alpha1; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushAlpha1(const LONG& lAlpha) { - m_oBrush.Alpha1 = lAlpha; - return S_OK; + m_oBrush.Alpha1 = lAlpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushColor2(LONG* lColor) { - *lColor = m_oBrush.Color2.GetLONG(); - return S_OK; + *lColor = m_oBrush.Color2.GetLONG(); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushColor2(const LONG& lColor) { - m_oBrush.Color2.SetBGR(lColor); - return S_OK; + m_oBrush.Color2.SetBGR(lColor); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushAlpha2(LONG* lAlpha) { - *lAlpha = m_oBrush.Alpha2; - return S_OK; + *lAlpha = m_oBrush.Alpha2; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushAlpha2(const LONG& lAlpha) { - m_oBrush.Alpha2 = lAlpha; - return S_OK; + m_oBrush.Alpha2 = lAlpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushTexturePath(std::wstring* bsPath) { - if (bsPath == NULL) return S_OK; - *bsPath = m_oBrush.TexturePath; - return S_OK; + if (bsPath == NULL) return S_OK; + *bsPath = m_oBrush.TexturePath; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushTexturePath(const std::wstring& bsPath) { - m_oBrush.TexturePath = bsPath; - return S_OK; + m_oBrush.TexturePath = bsPath; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushTextureMode(LONG* lMode) { - *lMode = m_oBrush.TextureMode; - return S_OK; + *lMode = m_oBrush.TextureMode; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushTextureMode(const LONG& lMode) { - m_oBrush.TextureMode = lMode; - return S_OK; + m_oBrush.TextureMode = lMode; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushTextureAlpha(LONG* lTxAlpha) { - *lTxAlpha = m_oBrush.TextureAlpha; - return S_OK; + *lTxAlpha = m_oBrush.TextureAlpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushTextureAlpha(const LONG& lTxAlpha) { - m_oBrush.TextureAlpha = lTxAlpha; - return S_OK; + m_oBrush.TextureAlpha = lTxAlpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_BrushLinearAngle(double* dAngle) { - *dAngle = m_oBrush.LinearAngle; - return S_OK; + *dAngle = m_oBrush.LinearAngle; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushLinearAngle(const double& dAngle) { - m_oBrush.LinearAngle = dAngle; - return S_OK; + m_oBrush.LinearAngle = dAngle; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::BrushRect(const INT& val, const double& left, const double& top, const double& width, const double& height) { - m_oBrush.Rectable = val; - m_oBrush.Rect.X = (float)left; - m_oBrush.Rect.Y = (float)top; - m_oBrush.Rect.Width = (float)width; - m_oBrush.Rect.Height = (float)height; + m_oBrush.Rectable = val; + m_oBrush.Rect.X = (float)left; + m_oBrush.Rect.Y = (float)top; + m_oBrush.Rect.Width = (float)width; + m_oBrush.Rect.Height = (float)height; - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::BrushBounds(const double& left, const double& top, const double& width, const double& height) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_BrushGradientColors(LONG* lColors, double* pPositions, LONG nCount) { - return S_OK; + return S_OK; } // font ------------------------------------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::SetFont(std::wstring bsXML) { //m_oFont.FromXmlString((std::wstring)bsXML); - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_FontName(std::wstring* bsName) { - if (bsName == NULL) return S_OK; - *bsName = m_oFont.Name; - return S_OK; + if (bsName == NULL) return S_OK; + *bsName = m_oFont.Name; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_FontName(const std::wstring& bsName) { - m_oFont.Name = bsName; - return S_OK; + m_oFont.Name = bsName; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_FontPath(std::wstring* bsName) { - if (bsName == NULL) return S_OK; - *bsName = m_oFont.Path; - return S_OK; + if (bsName == NULL) return S_OK; + *bsName = m_oFont.Path; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_FontPath(const std::wstring& bsName) { - m_oFont.Path = bsName; - return S_OK; + m_oFont.Path = bsName; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_FontSize(double* dSize) { - *dSize = m_oFont.Size; - return S_OK; + *dSize = m_oFont.Size; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_FontSize(const double& dSize) { - m_oFont.Size = dSize; - return S_OK; + m_oFont.Size = dSize; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_FontStyle(LONG* lStyle) { - *lStyle = m_oFont.GetStyle(); - return S_OK; + *lStyle = m_oFont.GetStyle(); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_FontStyle(const LONG& lStyle) { - m_oFont.SetStyle(lStyle); - return S_OK; + m_oFont.SetStyle(lStyle); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_FontStringGID(INT* bGID) { - *bGID = m_oFont.StringGID; - return S_OK; + *bGID = m_oFont.StringGID; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_FontStringGID(const INT& bGID) { - m_oFont.StringGID = bGID; - m_pFontManager->SetStringGID(bGID); - return S_OK; + m_oFont.StringGID = bGID; + m_pFontManager->SetStringGID(bGID); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_FontCharSpace(double* dSpace) { - *dSpace = m_oFont.CharSpace; - return S_OK; + *dSpace = m_oFont.CharSpace; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_FontCharSpace(const double& dSpace) { - m_oFont.CharSpace = dSpace; - return S_OK; + m_oFont.CharSpace = dSpace; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_FontFaceIndex(int* lFaceIndex) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_FontFaceIndex(const int& lFaceIndex) { - return S_OK; + return S_OK; } // shadow ----------------------------------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::SetShadow(std::wstring bsXML) { //m_oShadow.FromXmlString((std::wstring)bsXML); - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_ShadowDistanceX(double* val) { - *val = m_oShadow.DistanceX; - return S_OK; + *val = m_oShadow.DistanceX; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_ShadowDistanceX(double val) { - m_oShadow.DistanceX = val; - return S_OK; + m_oShadow.DistanceX = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_ShadowDistanceY(double* val) { - *val = m_oShadow.DistanceY; - return S_OK; + *val = m_oShadow.DistanceY; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_ShadowDistanceY(double val) { - m_oShadow.DistanceY = val; - return S_OK; + m_oShadow.DistanceY = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_ShadowBlurSize(double* val) { - *val = m_oShadow.BlurSize; - return S_OK; + *val = m_oShadow.BlurSize; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_ShadowBlurSize(double val) { - m_oShadow.BlurSize = val; - return S_OK; + m_oShadow.BlurSize = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_ShadowColor(LONG* val) { - *val = m_oShadow.Color.GetLONG(); - return S_OK; + *val = m_oShadow.Color.GetLONG(); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_ShadowColor(LONG val) { - m_oShadow.Color.SetBGR(val); - return S_OK; + m_oShadow.Color.SetBGR(val); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_ShadowAlpha(LONG* val) { - *val = m_oShadow.Alpha; - return S_OK; + *val = m_oShadow.Alpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_ShadowAlpha(LONG val) { - m_oShadow.Alpha = val; - return S_OK; + m_oShadow.Alpha = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_ShadowVisible(bool* val) { - *val = m_oShadow.Visible; - return S_OK; + *val = m_oShadow.Visible; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_ShadowVisible(bool val) { - m_oShadow.Visible = val; - return S_OK; + m_oShadow.Visible = val; + return S_OK; } // edge ------------------------------------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::SetEdgeText(std::wstring bsXML) { //m_oEdge.FromXmlString((std::wstring)bsXML); - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_EdgeVisible(LONG* val) { - *val = m_oEdge.Visible; - return S_OK; + *val = m_oEdge.Visible; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_EdgeVisible(LONG val) { - m_oEdge.Visible = val; - return S_OK; + m_oEdge.Visible = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_EdgeColor(LONG* val) { - *val = m_oEdge.Color.GetLONG(); - return S_OK; + *val = m_oEdge.Color.GetLONG(); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_EdgeColor(LONG val) { - m_oEdge.Color.SetBGR(val); - return S_OK; + m_oEdge.Color.SetBGR(val); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_EdgeAlpha(LONG* val) { - *val = m_oEdge.Alpha; - return S_OK; + *val = m_oEdge.Alpha; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_EdgeAlpha(LONG val) { - m_oEdge.Alpha = val; - return S_OK; + m_oEdge.Alpha = val; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::get_EdgeDist(double* val) { - *val = m_oEdge.Dist; - return S_OK; + *val = m_oEdge.Dist; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_EdgeDist(double val) { - m_oEdge.Dist = val; - return S_OK; + m_oEdge.Dist = val; + return S_OK; } //-------- Функции для вывода текста -------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::CommandDrawText(const std::wstring& bsText, const double& x, const double& y, const double& w, const double& h) { - if (c_nHyperlinkType == m_lCurrentCommandType) - return S_OK; + if (c_nHyperlinkType == m_lCurrentCommandType) + return S_OK; if (true) - { - PathCommandEnd(); - BeginCommand(c_nPathType); - PathCommandText(bsText, x, y, w, h); - DrawPath(c_nWindingFillMode); - EndCommand(c_nPathType); - PathCommandEnd(); - return S_OK; - } + { + PathCommandEnd(); + BeginCommand(c_nPathType); + PathCommandText(bsText, x, y, w, h); + DrawPath(c_nWindingFillMode); + EndCommand(c_nPathType); + PathCommandEnd(); + return S_OK; + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::CommandDrawTextCHAR(const LONG& c, const double& x, const double& y, const double& w, const double& h) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::CommandDrawTextExCHAR(const LONG& c, const LONG& gid, const double& x, const double& y, const double& w, const double& h) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandTextCHAR(const LONG& c, const double& x, const double& y, const double& w, const double& h) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandTextExCHAR(const LONG& c, const LONG& gid, const double& x, const double& y, const double& w, const double& h) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::CommandLong(const LONG& lType, const LONG& lCommand) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::CommandDouble(const LONG& lType, const double& dCommand) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::CommandString(const LONG& lType, const std::wstring& sCommand) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::CommandDrawTextEx(const std::wstring& bsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const double& x, const double& y, const double& w, const double& h) { if (true) - { - PathCommandEnd(); - BeginCommand(c_nPathType); - PathCommandTextEx(bsUnicodeText, pGids, nGidsCount ,x, y, w, h); - DrawPath(c_nWindingFillMode); - EndCommand(c_nPathType); - PathCommandEnd(); - return S_OK; - } - return S_OK; + { + PathCommandEnd(); + BeginCommand(c_nPathType); + PathCommandTextEx(bsUnicodeText, pGids, nGidsCount ,x, y, w, h); + DrawPath(c_nWindingFillMode); + EndCommand(c_nPathType); + PathCommandEnd(); + return S_OK; + } + return S_OK; } //-------- Маркеры для команд --------------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::BeginCommand(const _UINT32& lType) { - if (c_nPathType == lType) - { - m_pSimpleGraphicsConverter->PathCommandEnd(); - } + if (c_nPathType == lType) + { + m_pSimpleGraphicsConverter->PathCommandEnd(); + } - m_lCurrentCommandType = lType; + m_lCurrentCommandType = lType; - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::EndCommand(const _UINT32& lType) { - m_lCurrentCommandType = -1; - return S_OK; + m_lCurrentCommandType = -1; + return S_OK; } //-------- Функции для работы с Graphics Path ----------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::PathCommandMoveTo(const double& x, const double& y) { - if (c_nSimpleGraphicType == m_lCurrentCommandType) - { - MoveTo(x, y); - } - else - { - m_pSimpleGraphicsConverter->PathCommandMoveTo(x, y); - } + if (c_nSimpleGraphicType == m_lCurrentCommandType) + { + MoveTo(x, y); + } + else + { + m_pSimpleGraphicsConverter->PathCommandMoveTo(x, y); + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandLineTo(const double& x, const double& y) { - if (c_nSimpleGraphicType == m_lCurrentCommandType) - { - LineTo(x, y); - } - else - { - m_pSimpleGraphicsConverter->PathCommandLineTo(x, y); - } + if (c_nSimpleGraphicType == m_lCurrentCommandType) + { + LineTo(x, y); + } + else + { + m_pSimpleGraphicsConverter->PathCommandLineTo(x, y); + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandLinesTo(double* points, const int& count) { - m_pSimpleGraphicsConverter->PathCommandLinesTo(points, count); - return S_OK; + m_pSimpleGraphicsConverter->PathCommandLinesTo(points, count); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandCurveTo(const double& x1, const double& y1, const double& x2, const double& y2, const double& x3, const double& y3) { - if (c_nSimpleGraphicType == m_lCurrentCommandType) - { - CurveTo(x1, y1, x2, y2, x3, y3); - } - else - { - m_pSimpleGraphicsConverter->PathCommandCurveTo(x1, y1, x2, y2, x3, y3); - } + if (c_nSimpleGraphicType == m_lCurrentCommandType) + { + CurveTo(x1, y1, x2, y2, x3, y3); + } + else + { + m_pSimpleGraphicsConverter->PathCommandCurveTo(x1, y1, x2, y2, x3, y3); + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandCurvesTo(double* points, const int& count) { - m_pSimpleGraphicsConverter->PathCommandCurvesTo(points, count); - return S_OK; + m_pSimpleGraphicsConverter->PathCommandCurvesTo(points, count); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandArcTo(const double& x, const double& y, const double& w, const double& h, const double& startAngle, const double& sweepAngle) { - m_pSimpleGraphicsConverter->PathCommandArcTo(x, y, w, h, startAngle, sweepAngle); - return S_OK; + m_pSimpleGraphicsConverter->PathCommandArcTo(x, y, w, h, startAngle, sweepAngle); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandClose() { - if (c_nSimpleGraphicType == m_lCurrentCommandType) - { - Close(); - } - else - { - m_pSimpleGraphicsConverter->PathCommandClose(); - } + if (c_nSimpleGraphicType == m_lCurrentCommandType) + { + Close(); + } + else + { + m_pSimpleGraphicsConverter->PathCommandClose(); + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandEnd() { - if (c_nSimpleGraphicType == m_lCurrentCommandType) - { - End(); - } - else - { - m_pSimpleGraphicsConverter->PathCommandEnd(); - } + if (c_nSimpleGraphicType == m_lCurrentCommandType) + { + End(); + } + else + { + m_pSimpleGraphicsConverter->PathCommandEnd(); + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::DrawPath(const LONG& nType) { - bool bIsStroke = ((0x01 == (nType & 0x01)) && (0 != m_oPen.Alpha)); - bool bIsFill = ((0xFF < nType) && (0 != m_oBrush.Alpha1)); + bool bIsStroke = ((0x01 == (nType & 0x01)) && (0 != m_oPen.Alpha)); + bool bIsFill = ((0xFF < nType) && (0 != m_oBrush.Alpha1)); - if (bIsStroke && bIsFill) - { + if (bIsStroke && bIsFill) + { m_oWriterVML.WriteString(L""); - m_oWriterVML.Write(m_oWriterPath); - m_oWriterVML.WriteString(std::wstring(L"")); - } - else if (bIsStroke) - { + m_oWriterVML.Write(m_oWriterPath); + m_oWriterVML.WriteString(std::wstring(L"")); + } + else if (bIsStroke) + { m_oWriterVML.WriteString(L""); - m_oWriterVML.Write(m_oWriterPath); - m_oWriterVML.WriteString(std::wstring(L"")); - } - else if (bIsFill) - { + m_oWriterVML.Write(m_oWriterPath); + m_oWriterVML.WriteString(std::wstring(L"")); + } + else if (bIsFill) + { m_oWriterVML.WriteString(L""); - m_oWriterVML.Write(m_oWriterPath); - m_oWriterVML.WriteString(std::wstring(L"")); - } + m_oWriterVML.Write(m_oWriterPath); + m_oWriterVML.WriteString(std::wstring(L"")); + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandStart() { - if (c_nSimpleGraphicType == m_lCurrentCommandType) - { - Start(); - } - else - { - m_pSimpleGraphicsConverter->PathCommandEnd(); - m_pSimpleGraphicsConverter->PathCommandStart(); - } + if (c_nSimpleGraphicType == m_lCurrentCommandType) + { + Start(); + } + else + { + m_pSimpleGraphicsConverter->PathCommandEnd(); + m_pSimpleGraphicsConverter->PathCommandStart(); + } - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandGetCurrentPoint(double* fX, double* fY) { - m_pSimpleGraphicsConverter->PathCommandGetCurrentPoint(fX, fY); - return S_OK; + m_pSimpleGraphicsConverter->PathCommandGetCurrentPoint(fX, fY); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandText(const std::wstring& bsText, const double& x, const double& y, const double& w, const double& h) { - _SetFont(); - m_pSimpleGraphicsConverter->PathCommandText(bsText, m_pFontManager, x, y, w, h, 0); - return S_OK; + _SetFont(); + m_pSimpleGraphicsConverter->PathCommandText(bsText, m_pFontManager, x, y, w, h, 0); + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::PathCommandTextEx(const std::wstring& bsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const double& x, const double& y, const double& w, const double& h) { bool bGid = m_oFont.StringGID; - //TODOO - //if (NULL != bsGidText) - //{ - // m_oFont.StringGID = true; - // PathCommandText(bsUnicodeText, x, y, w, h, baselineOffset); - //} - - m_oFont.StringGID = false; - PathCommandText(bsUnicodeText, x, y, w, h); + //TODOO + //if (NULL != bsGidText) + //{ + // m_oFont.StringGID = true; + // PathCommandText(bsUnicodeText, x, y, w, h, baselineOffset); + //} - m_oFont.StringGID = bGid; - return S_OK; + m_oFont.StringGID = false; + PathCommandText(bsUnicodeText, x, y, w, h); + + m_oFont.StringGID = bGid; + return S_OK; } //-------- Функции для вывода изображений --------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::DrawImage(IGrObject* pImage, const double& x, const double& y, const double& w, const double& h) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::DrawImageFromFile(const std::wstring&, const double& x, const double& y, const double& w, const double& h, const BYTE& lAlpha) { - return S_OK; + return S_OK; } // transform -------------------------------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::GetCommandParams(double* dAngle, double* dLeft, double* dTop, double* dWidth, double* dHeight, _UINT32* lFlags) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::SetCommandParams(double dAngle, double dLeft, double dTop, double dWidth, double dHeight, _UINT32 lFlags) { - if ((dWidth <= 1) || (dHeight <= 1)) - lFlags = 0; + if ((dWidth <= 1) || (dHeight <= 1)) + lFlags = 0; bool bFlipX = (0 != (c_nParamFlipX & lFlags)); bool bFlipY = (0 != (c_nParamFlipY & lFlags)); - - double m11 = bFlipX ? -1.0 : 1.0; - double m22 = bFlipY ? -1.0 : 1.0; - - Aggplus::CMatrix oMatrix(1, 0, 0, 1, 0, 0); - if ((0 != dAngle) || (0 != lFlags)) - { - double dCentreX = (dLeft + dWidth / 2.0); - double dCentreY = (dTop + dHeight / 2.0); - - oMatrix.Translate(-dCentreX, -dCentreY , Aggplus::MatrixOrderAppend); - - oMatrix.Rotate(dAngle , Aggplus::MatrixOrderAppend); - oMatrix.Scale(m11, m22 , Aggplus::MatrixOrderAppend); - - oMatrix.Translate(dCentreX, dCentreY , Aggplus::MatrixOrderAppend); - } + double m11 = bFlipX ? -1.0 : 1.0; + double m22 = bFlipY ? -1.0 : 1.0; - m_oTransform = oMatrix; - CalculateFullTransform(); + Aggplus::CMatrix oMatrix(1, 0, 0, 1, 0, 0); - return S_OK; + if ((0 != dAngle) || (0 != lFlags)) + { + double dCentreX = (dLeft + dWidth / 2.0); + double dCentreY = (dTop + dHeight / 2.0); + + oMatrix.Translate(-dCentreX, -dCentreY , Aggplus::MatrixOrderAppend); + + oMatrix.Rotate(dAngle , Aggplus::MatrixOrderAppend); + oMatrix.Scale(m11, m22 , Aggplus::MatrixOrderAppend); + + oMatrix.Translate(dCentreX, dCentreY , Aggplus::MatrixOrderAppend); + } + + m_oTransform = oMatrix; + CalculateFullTransform(); + + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::SetTransform(const double& m1, const double& m2, const double& m3, const double& m4, const double& m5, const double& m6) { - Aggplus::CMatrix oTrans(m1, m2, m3, m4, m5, m6); - m_oTransform = oTrans; + Aggplus::CMatrix oTrans(m1, m2, m3, m4, m5, m6); + m_oTransform = oTrans; - CalculateFullTransform(); + CalculateFullTransform(); - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::GetTransform(double *pdA, double *pdB, double *pdC, double *pdD, double *pdE, double *pdF) { - return S_OK; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::ResetTransform(void) { - m_oTransform.Reset(); - CalculateFullTransform(); - return S_OK; + m_oTransform.Reset(); + CalculateFullTransform(); + return S_OK; } // ----------------------------------------------------------------------------------------- HRESULT PPT_FORMAT::CShapeWriter::get_ClipMode(LONG* plMode) { - *plMode = m_lClipMode; - return S_OK; + *plMode = m_lClipMode; + return S_OK; } HRESULT PPT_FORMAT::CShapeWriter::put_ClipMode(const LONG& lMode) { - m_lClipMode = lMode; - return S_OK; + m_lClipMode = lMode; + return S_OK; } diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.h b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.h index 756bcb5d6d..431595605a 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.h +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/ShapeWriter.h @@ -448,7 +448,7 @@ namespace PPT_FORMAT void WriteGroupInfo(); void WriteTableInfo(); - void WriteButton(int paragraphNum = -1); + void WriteHyperlink(const std::vector &actions); std::vector getActionsByNum(const int num); std::wstring ConvertTableCells(); std::wstring ConvertTableRow(); diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TableWriter.cpp b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TableWriter.cpp new file mode 100644 index 0000000000..cf19fc11e6 --- /dev/null +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TableWriter.cpp @@ -0,0 +1,670 @@ +#include "TableWriter.h" +#include "TxBodyConverter.h" +#include + +TableWriter::TableWriter(CTableElement *pTableElement, CRelsGenerator* pRels) : + m_pTableElement(pTableElement), m_pRels(pRels) +{ + +} + +void TableWriter::Convert(PPTX::Logic::GraphicFrame &oGraphicFrame) +{ + if (!m_pTableElement) + return; + + if (m_pTableElement->m_xmlRawData.empty()/* || true*/) + { + oGraphicFrame.nvGraphicFramePr = new PPTX::Logic::NvGraphicFramePr; + FillNvGraphicFramePr(oGraphicFrame.nvGraphicFramePr.get2()); + + oGraphicFrame.xfrm = new PPTX::Logic::Xfrm; + FillXfrm(oGraphicFrame.xfrm.get2()); + + oGraphicFrame.table = new PPTX::Logic::Table; + FillTable(oGraphicFrame.table.get2()); + } + else + { + oGraphicFrame.fromXMLString(getXmlForGraphicFrame()); +// CorrectGraphicFrame(oGraphicFrame); + } +} + +void TableWriter::FillNvGraphicFramePr(PPTX::Logic::NvGraphicFramePr& oNvGFPr) +{ + oNvGFPr.cNvPr.id = m_pTableElement->m_lID; + oNvGFPr.cNvPr.name = m_pTableElement->m_sName; + + // not works in full + oNvGFPr.cNvGraphicFramePr.noGrp = true; + + PPTX::Logic::Ext ext; + ext.uri = L"{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}"; + oNvGFPr.nvPr.extLst.push_back(ext); +} + +void TableWriter::FillXfrm(PPTX::Logic::Xfrm &oXFRM) +{ + oXFRM.m_ns = L"p"; + double multip1 = m_pTableElement->m_bAnchorEnabled ? 1587.5 : 1; + + oXFRM.offX = round(m_pTableElement->m_rcAnchor.left * multip1); + oXFRM.offY = round(m_pTableElement->m_rcAnchor.top * multip1); + + oXFRM.extX = round(m_pTableElement->m_rcAnchor.GetWidth() * multip1); + oXFRM.extY = round(m_pTableElement->m_rcAnchor.GetHeight() * multip1); +} + +void TableWriter::FillTable(PPTX::Logic::Table &oTable) +{ + oTable.tableProperties = new PPTX::Logic::TableProperties; + FillTblPr(oTable.tableProperties.get2()); + + std::vector arrCells, arrSpliters; + prepareShapes(arrCells, arrSpliters); + m_nPTable = new ProtoTable(arrCells, arrSpliters, m_pRels); + FillTblGrid(oTable.TableCols , arrCells); + + + auto protoTable = m_nPTable->getTable(); + auto arrHeight = ProtoTable::getHeight(arrCells); + for (UINT cRow = 0; cRow < protoTable.size(); cRow++) + { + PPTX::Logic::TableRow tr; + FillRow(tr, protoTable[cRow]); + tr.Height = ProtoTable::checkRowForZeroHeight(protoTable[cRow]) ? 0 : arrHeight[cRow]; + oTable.TableRows.push_back(tr); + } +} + +std::vector ProtoTable::getWidth(std::vector& arrCells, bool isWidth) +{ + std::map mapLeftWidth; + for (const auto* pCell : arrCells) + { + if (!pCell) continue; + double left = pCell->m_rcChildAnchor.left; + double width = pCell->m_rcChildAnchor.right - left; + + // Here we search uniq left to answer: is it new colum? + auto iter = mapLeftWidth.find(left); + if (iter == mapLeftWidth.end()) + { + mapLeftWidth.insert(std::make_pair(left, width)); + } + // Here we check qestion: was it merged cell and now is it true width of colum? + else if (iter->second > width) + { + mapLeftWidth.erase(iter); + mapLeftWidth.insert(std::make_pair(left, width)); + } + } + + std::vector gridWidth; + double multip = isWidth ? 1587.5 : 1.0; + for (const auto& w : mapLeftWidth) + { + double value = isWidth ? w.second : w.first; + gridWidth.push_back(round(value * multip)); + } + + return gridWidth; +} + +std::vector ProtoTable::getHeight(std::vector& arrCells, bool isHeight) +{ + std::map mapTopHeight; + for (auto* pCell : arrCells) + { + if (!pCell) continue; + double top = pCell->m_rcChildAnchor.top; + double height = pCell->m_rcChildAnchor.bottom - top; + + // Here we search uniq top to answer: is it new row? + auto iter = mapTopHeight.find(top); + if (iter == mapTopHeight.end()) + { + mapTopHeight.insert(std::make_pair(top, height)); + } + // Here we check qestion: was it merged cell and now is it true height of row? + else if (iter->second > height) + { + mapTopHeight.erase(iter); + mapTopHeight.insert(std::make_pair(top, height)); + } + + } + + std::vector gridHeight; + double multip = isHeight ? 1587.5 : 1.0; + for (const auto& h : mapTopHeight) + { + double value = isHeight ? h.second : h.first; + gridHeight.push_back(round(value * multip)); + } + + return gridHeight; +} + +bool ProtoTable::checkRowForZeroHeight(const ProtoTableRow &oRow) +{ + for (const auto& cell : oRow) + { + if (cell.isRealCell()) + return false; + } + + return true; +} + +void ProtoTable::initProtoTable() +{ + const UINT countRow = m_arrTop.size(); + const UINT countCol = m_arrLeft.size(); + + m_table.clear(); + for (UINT cRow = 0; cRow < countRow; cRow++) + { + ProtoTableRow protoRow; + for (UINT cCol = 0; cCol < countCol; cCol++) + protoRow.push_back(TCell(nullptr, cRow, cCol, m_pRels, nullptr)); + + m_table.push_back(protoRow); + } +} + +bool ProtoTable::fillProtoTable(std::vector &arrCells, + std::vector& arrSpliters) +{ + if (m_table.empty() || m_arrTop.empty() || m_arrLeft.empty()) + return false; + + bool wasCellsFilled = fillCells(arrCells); + fillBorders(arrSpliters); + + return wasCellsFilled; +} + +bool ProtoTable::fillCells(std::vector &arrCells) +{ + const UINT countRow = m_arrTop.size(); + const UINT countCol = m_arrLeft.size(); + + for (auto* pCell : arrCells) + { + int left = pCell->m_rcChildAnchor.left; + int top = pCell->m_rcChildAnchor.top; + int right = pCell->m_rcChildAnchor.right; + int bottom = pCell->m_rcChildAnchor.bottom; + + UINT posRow = 0, posCol = 0; + for (; posRow < countRow; posRow++) + if (top == m_arrTop[posRow]) break; + for (; posCol < countCol; posCol++) + if (left == m_arrLeft[posCol]) break; + TCell* pParent = &m_table[posRow][posCol]; + + UINT posRightCol = 0, posBottomRow = 0; + for (; posBottomRow < countRow; posBottomRow++) + if (bottom == m_arrTop[posBottomRow]) break; + for (; posRightCol < countCol; posRightCol++) + if (right == m_arrLeft[posRightCol]) break; + + for (UINT cRow = posRow; cRow < posBottomRow; cRow++) + for (UINT cCol = posCol; cCol < posRightCol; cCol++) + { + auto& tCell = m_table[cRow][cCol]; + tCell.setPParent(pParent); + + if (posCol == cCol) + tCell.setGridSpan(posRightCol - cCol); + + if (posRow == cRow) + tCell.setRowSpan(posBottomRow - cRow); + } + pParent->setPParent(nullptr); + pParent->setPShape(pCell); + + // pParent->setGridSpan(posRightCol - posCol); + // pParent->setRowSpan(posBottomRow - posRow); + } + + return true; +} + +void ProtoTable::fillBorders(std::vector &arrSpliters) +{ + for (auto* pBorder : arrSpliters) + { + int left = pBorder->m_rcChildAnchor.left; + int top = pBorder->m_rcChildAnchor.top; + int right = pBorder->m_rcChildAnchor.right; + int bottom = pBorder->m_rcChildAnchor.bottom; + + UINT posFirstTop, posFirstLeft; + UINT posLastTop, posLastLeft; + + findCellPos(top, left, posFirstTop, posFirstLeft); + findCellPos(bottom, right, posLastTop, posLastLeft); + if (!isDefaultBoard(pBorder)) + { + setBorders(posFirstTop, posFirstLeft, posLastTop, posLastLeft, pBorder); + } + } +} + +bool ProtoTable::findCellPos(const int top, const int left, UINT &posRow, UINT &posCol) +{ + const UINT countRow = m_arrTop.size(); + const UINT countCol = m_arrLeft.size(); + + for (posRow = 0; posRow < countRow; posRow++) + if (top == m_arrTop[posRow]) break; + for (posCol = 0; posCol < countCol; posCol++) + if (left == m_arrLeft[posCol]) break; + + return !(posRow == countRow || posCol == countCol); +} + +void ProtoTable::setBorders(const UINT posFRow, const UINT posFCol, const UINT posLRow, const UINT posLCol, CShapeElement* pBorder) +{ + + const UINT countRow = m_arrTop.size(); + const UINT countCol = m_arrLeft.size(); + + // lnTlToBr or lnBlToTr + if ((posFRow != posLRow) && (posFCol != posLCol)) + { + auto borPos = posFRow > posLRow ? TCell::lnBlToTr : TCell::lnTlToBr; + m_table[posFRow][posFCol].setBorder(borPos, pBorder); + return; + } + + // lnT or(and) lnB + if (posFCol != posLCol) + { + for (UINT i = posFCol; i < posLCol; i++) + { + if (posFRow < countRow) + m_table[posFRow][i].setBorder(TCell::lnT, pBorder); + if (posFRow > 0) + m_table[posFRow-1][i].setBorder(TCell::lnB, pBorder); + } + + return; + } + + // lnL or(and) lnR + if (posFRow != posLRow) + { + for (UINT i = posFRow; i < posLRow; i++) + { + if (posFCol < countCol) + m_table[i][posFCol].setBorder(TCell::lnL, pBorder); + if (posFCol > 0) + m_table[i][posFCol-1].setBorder(TCell::lnR, pBorder); + } + + return; + } +} + +bool ProtoTable::isDefaultBoard(const CShapeElement *pBorder) +{ + if (pBorder == nullptr) + return false; + + auto& color = pBorder->m_oPen.Color; + + return color.m_lSchemeIndex == 13; +} + +std::vector > ProtoTable::getRows(std::vector &arrCells) +{ + std::vector > arrRows; + int rowTop = -1; + for (auto* pCell : arrCells) + { + if (!pCell) continue; + + int top = int(pCell->m_rcChildAnchor.top); + if (top != rowTop) + { + rowTop = top; + arrRows.push_back(std::vector()); + } + arrRows.back().push_back(pCell); + } + + return arrRows; +} + +MProtoTable ProtoTable::getTable() const +{ + return m_table; +} + +void TableWriter::FillTblPr(PPTX::Logic::TableProperties &oTblPr) +{ + // oTblPr.TableStyleId = L"{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}"; + // oTblPr.FirstRow = true; + // oTblPr.BandRow = true; +} + +void TableWriter::FillTblGrid(std::vector &tblGrid, std::vector& arrCells) +{ + auto grid = ProtoTable::getWidth(arrCells); + for (const auto& w : grid) + { + PPTX::Logic::TableCol tc; + tc.Width = w; + tblGrid.push_back(tc); + } +} + +void TableWriter::prepareShapes(std::vector &arrCells, std::vector &arrSpliters) +{ + for (const auto& ptrShape : m_pTableElement->m_pChildElements) + { + auto pShapeEl = dynamic_cast(ptrShape.get()); + switch (pShapeEl->m_lShapeType) + { + case 1: + arrCells.push_back(pShapeEl); + break; + case 20: + arrSpliters.push_back(pShapeEl); + break; + } + } +} + +void TableWriter::FillRow(PPTX::Logic::TableRow &oRow, ProtoTableRow& arrCells) +{ + if (arrCells.empty()) return; + + for (auto& protoCell : arrCells) + { + PPTX::Logic::TableCell cell; + protoCell.FillTc(cell); + oRow.Cells.push_back(cell); + } +} + +std::wstring TableWriter::getXmlForGraphicFrame() const +{ + auto& rXml = m_pTableElement->m_xmlRawData; + + auto startIter = rXml.find(L""); + auto endIter = rXml.find(L""); + std::wstring xml = L""; + xml += std::wstring(rXml.begin() + startIter, rXml.begin() + endIter); + xml += L""; + + return xml; +} + +void TableWriter::CorrectGraphicFrame(PPTX::Logic::GraphicFrame &oGraphicFrame) +{ + FillnvPr(oGraphicFrame.nvGraphicFramePr->nvPr); +} + +void TableWriter::FillnvPr(PPTX::Logic::NvPr &oNvPr) +{ + PPTX::Logic::Ext ext; + ext.uri = L"{D42A27DB-BD31-4B8C-83A1-F6EECF244321}"; + + oNvPr.extLst.push_back(ext); +} + +TCell::TCell(CShapeElement *pShape, int row, int col, CRelsGenerator* pRels, TCell *pParent) : + m_pShape(pShape), m_row(row), m_col(col), m_rowSpan(1), m_gridSpan(1), + m_pParent(pParent), m_parentDirection(none), m_pRels(pRels) +{ + setParentDirection(); +} + +void TCell::FillTc(PPTX::Logic::TableCell &oTc) +{ + if (m_gridSpan > 1) + oTc.GridSpan = m_gridSpan; + if (m_rowSpan > 1) + oTc.RowSpan = m_rowSpan; + + oTc.txBody = new PPTX::Logic::TxBody(L"a:txBody"); + FillTxBody(oTc.txBody.get2()); + + if (m_pParent) + { + FillMergeDirection(oTc); + return; + } + + oTc.CellProperties = new PPTX::Logic::TableCellProperties; + FillTcPr(oTc.CellProperties.get2()); +} + +void TCell::setBorder(TCell::eBorderPossition borderPos, CShapeElement *pBorder) +{ + if (m_pShape) + m_mapBorders[borderPos] = pBorder; + else if (m_pParent) + m_pParent->setBorder(borderPos, pBorder); +} + +TCell::eMergeDirection TCell::parentDirection() const +{ + return m_parentDirection; +} + +int TCell::getHeight() const +{ + auto pShape = m_pParent ? m_pParent->m_pShape : m_pShape; + double multip = pShape->m_bAnchorEnabled ? 1587.5 : 1; + double height = pShape->m_rcChildAnchor.bottom - pShape->m_rcChildAnchor.top; + + return round(height * multip); +} + +void TCell::setPParent(TCell *pParent) +{ + m_pParent = pParent; + setParentDirection(); +} + +void TCell::FillMergeDirection(PPTX::Logic::TableCell &oTc) +{ + if (parentDirection() & horz) + oTc.HMerge = true; + if (parentDirection() & vert) + oTc.VMerge = true; +} + +void TCell::setParentDirection() +{ + if (m_pParent) + { + // Todo rewrite it + if (m_pParent->m_col == m_col && m_pParent->m_row != m_row) + m_parentDirection = vert; + else if (m_pParent->m_col != m_col && m_pParent->m_row == m_row) + m_parentDirection = horz; + else + m_parentDirection = hove; + } +} + +void TCell::setGridSpan(int gridSpan) +{ + m_gridSpan = gridSpan; +} + +bool TCell::isRealCell() const +{ + if (m_rowSpan == 2 || m_gridSpan == 2 || m_parentDirection != TCell::none) + return false; + return true; +} + +void TCell::FillTxBody(PPTX::Logic::TxBody &oTxBody) +{ + if (m_pShape == nullptr) + { + TxBodyConverter txBodyConverter(nullptr, m_pRels, TxBodyConverter::table); + txBodyConverter.FillTxBody(oTxBody); + } else + { + TxBodyConverter txBodyConverter(m_pShape, m_pRels, TxBodyConverter::table); + txBodyConverter.FillTxBody(oTxBody); + } + +} + +void TCell::FillTcPr(PPTX::Logic::TableCellProperties &oTcPr) +{ + //anchor + auto& attr = m_pShape->m_pShape->m_oText.m_oAttributes; + if (attr.m_nTextAlignVertical != -1) + { + auto pAnchor = new PPTX::Limit::TextAnchor; + BYTE anchor[] = {4,1,0}; + if (sizeof (anchor) > (UINT)attr.m_nTextAlignVertical) + pAnchor->SetBYTECode(anchor[attr.m_nTextAlignVertical]); + + oTcPr.Anchor = pAnchor; + } + if (attr.m_nTextAlignHorizontal == 1) + { + oTcPr.AnchorCtr = true; + } + + oTcPr.MarB = round(m_pShape->m_pShape->m_dTextMarginBottom); // 0 + oTcPr.MarT = round(m_pShape->m_pShape->m_dTextMarginY); // 12512 + oTcPr.MarL = round(m_pShape->m_pShape->m_dTextMarginX); + oTcPr.MarR = round(m_pShape->m_pShape->m_dTextMarginRight); + + if (true) + { + oTcPr.HorzOverflow = new PPTX::Limit::HorzOverflow; + oTcPr.HorzOverflow->set(L"overflow"); + } + + auto pSolidFill = new PPTX::Logic::SolidFill; + auto& brush = m_pShape->m_oBrush; + + auto& clr = brush.Color1; + pSolidFill->Color.SetRGBColor(clr.GetR(), clr.GetG(), clr.GetB()); + if (brush.Alpha1 != 255) + { + PPTX::Logic::ColorModifier alpha; + alpha.name = L"a:alpha"; + alpha.val = brush.Alpha1 * 392; + pSolidFill->Color.Color->Modifiers.push_back(alpha); + } + if (brush.Type == 5000) + { + PPTX::Logic::ColorModifier alpha; + alpha.name = L"a:alpha"; + alpha.val = 0; + pSolidFill->Color.Color->Modifiers.push_back(alpha); + } + + oTcPr.Fill.Fill.reset(pSolidFill); + + for (auto IterBorder : m_mapBorders) + { + auto pLn = new PPTX::Logic::Ln; + FillLn(*pLn, IterBorder.first, IterBorder.second); + switch (IterBorder.first) + { + case lnL: oTcPr.LnL = pLn; break; + case lnR: oTcPr.LnR = pLn; break; + case lnT: oTcPr.LnT = pLn; break; + case lnB: oTcPr.LnB = pLn; break; + case lnBlToTr: oTcPr.LnBlToTr = pLn; break; + case lnTlToBr: oTcPr.LnTlToBr = pLn; break; + } + } +} + +void TCell::FillLn(PPTX::Logic::Ln &Ln, TCell::eBorderPossition eBP, CShapeElement *pBorder) +{ + if (pBorder == nullptr) + return; + switch (eBP) + { + case lnL: Ln.m_name = L"a:lnL"; break; + case lnR: Ln.m_name = L"a:lnR"; break; + case lnT: Ln.m_name = L"a:lnT"; break; + case lnB: Ln.m_name = L"a:lnB"; break; + case lnBlToTr: Ln.m_name = L"a:lnBlToTr"; break; + case lnTlToBr: Ln.m_name = L"a:lnTlToBr"; break; + } + + auto& pen = pBorder->m_oPen; + Ln.w = pen.Size; + + auto pSolidFill = new PPTX::Logic::SolidFill; + auto& clr = pen.Color; + pSolidFill->Color.SetRGBColor(clr.GetR(), clr.GetG(), clr.GetB()); + if (pen.Alpha && pen.Alpha != 255) + { + PPTX::Logic::ColorModifier alpha; + alpha.name = L"a:alpha"; + alpha.val = pen.Alpha * 392; + pSolidFill->Color.Color->Modifiers.push_back(alpha); + } + Ln.Fill.Fill.reset(pSolidFill); + + Ln.prstDash = new PPTX::Logic::PrstDash; + Ln.prstDash->val = new PPTX::Limit::PrstDashVal; + auto oldDash = pen.DashStyle; + BYTE dash[] = {6,7,10,8,9,2,0,3,1,4}; + if (sizeof (dash) > oldDash) + Ln.prstDash->val->SetBYTECode(dash[oldDash]); + + // TODO? + Ln.cap = new PPTX::Limit::LineCap; + Ln.cmpd = new PPTX::Limit::CompoundLine; + Ln.algn = new PPTX::Limit::PenAlign; + + auto* pLineEnd = new PPTX::Logic::LineEnd; + pLineEnd->m_name = L"a:headEnd"; + pLineEnd->type = new PPTX::Limit::LineEndType; + pLineEnd->w = new PPTX::Limit::LineEndSize; + pLineEnd->len = new PPTX::Limit::LineEndSize; + Ln.headEnd = pLineEnd; + + pLineEnd = new PPTX::Logic::LineEnd; + pLineEnd->m_name = L"a:tailEnd"; + pLineEnd->type = new PPTX::Limit::LineEndType; + pLineEnd->w = new PPTX::Limit::LineEndSize; + pLineEnd->len = new PPTX::Limit::LineEndSize; + Ln.tailEnd = pLineEnd; + + Ln.Join.type = PPTX::Logic::eJoin::JoinRound; +} + +void TCell::setRowSpan(int rowSpan) +{ + m_rowSpan = rowSpan; +} + +void TCell::setPShape(CShapeElement *pShape) +{ + m_pShape = pShape; + m_parentDirection = none; +} + + + +ProtoTable::ProtoTable(std::vector &arrCells, + std::vector& arrSpliters, + CRelsGenerator *pRels) : m_pRels(pRels) +{ + m_arrLeft = getWidth(arrCells, false); + m_arrTop = getHeight(arrCells, false); + initProtoTable(); + fillProtoTable(arrCells, arrSpliters); +} diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TableWriter.h b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TableWriter.h new file mode 100644 index 0000000000..78239491f7 --- /dev/null +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TableWriter.h @@ -0,0 +1,172 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2019 + * + * 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 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * 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 + * + */ +#pragma once + +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/GraphicFrame.h" +#include "../../../ASCOfficePPTXFile/Editor/Drawing/Elements.h" +#include "ImageManager.h" + +namespace PPT_FORMAT +{ +class TCell +{ +public: + TCell(CShapeElement *pShape, int row, int col, CRelsGenerator* pRels, TCell* pParent = nullptr); + + void FillTc(PPTX::Logic::TableCell &oTc); + + enum eMergeDirection { + none = 0b00, + vert = 0b01, + horz = 0b10, + hove = (horz | vert) + }; + + enum eBorderPossition + { + lnL, + lnR, + lnT, + lnB, + lnTlToBr, + lnBlToTr + }; + void setBorder(eBorderPossition borderPos, CShapeElement *pBorder); + + eMergeDirection parentDirection() const; + int getHeight()const; + + void setPParent(TCell *pParent); + void setPShape(CShapeElement *pShape); + + void setRowSpan(int rowSpan); + + void setGridSpan(int gridSpan); + + bool isRealCell()const; + +private: + void FillTxBody(PPTX::Logic::TxBody &oTxBody); + void FillTcPr(PPTX::Logic::TableCellProperties& oTcPr); + void FillLn(PPTX::Logic::Ln& Ln, eBorderPossition eBP, CShapeElement* pBorder); + + void FillMergeDirection(PPTX::Logic::TableCell& oTc); + void setParentDirection(); + +private: + CShapeElement* m_pShape; + + std::map m_mapBorders; + + // Proto table's coord + int m_row, m_col; + + int m_rowSpan; + int m_gridSpan; + + // Parent + TCell* m_pParent; + eMergeDirection m_parentDirection; + + // Common + CRelsGenerator* m_pRels; +}; + + +typedef std::vector ProtoTableRow; +typedef std::vector MProtoTable; + + +class ProtoTable +{ +public: + ProtoTable(std::vector &arrCells, + std::vector& arrSpliters, + CRelsGenerator* pRels); + + static std::vector getWidth(std::vector &arrCells, bool isWidth = true); + static std::vector getHeight(std::vector &arrCells, bool isHeight = true); + static bool checkRowForZeroHeight(const ProtoTableRow& oRow); + MProtoTable getTable() const; + +private: + void initProtoTable(); + bool fillProtoTable(std::vector &arrCells, std::vector &arrSpliters); + bool fillCells(std::vector &arrCells); + void fillBorders(std::vector &arrSpliters); + bool findCellPos(const int top, const int left, UINT& posRow, UINT& posCol); + std::list getParentCellFromTable(const UINT posFRow, const UINT posFCol, const UINT posLRow, const UINT posLCol); + void setBorders(const UINT posFRow, const UINT posFCol, const UINT posLRow, const UINT posLCol, CShapeElement *pBorder); + + bool isDefaultBoard(const CShapeElement *pBorder); + + std::vector > + getRows(std::vector &arrCells); + +private: + std::vector m_arrLeft; + std::vector m_arrTop; + MProtoTable m_table; + CRelsGenerator* m_pRels; +}; + +class TableWriter +{ +public: + TableWriter(CTableElement *pTableElement, CRelsGenerator* pRels); + + void Convert(PPTX::Logic::GraphicFrame& oGraphicFrame); + +private: + void FillNvGraphicFramePr(PPTX::Logic::NvGraphicFramePr& oNvGFPr); + void FillXfrm(PPTX::Logic::Xfrm& oXFRM); + void FillTable(PPTX::Logic::Table &oTable); + + void FillTblPr(PPTX::Logic::TableProperties& oTblPr); + void FillTblGrid(std::vector& tblGrid, + std::vector &arrCells); + void prepareShapes(std::vector &arrCells, + std::vector& arrSpliters); + + void FillRow(PPTX::Logic::TableRow& oRow, ProtoTableRow &arrCells); + +private: + std::wstring getXmlForGraphicFrame()const; + void CorrectGraphicFrame(PPTX::Logic::GraphicFrame& oGraphicFrame); + void FillnvPr(PPTX::Logic::NvPr& oNvPr); + +private: + CTableElement* m_pTableElement; + CRelsGenerator* m_pRels; + nullable m_nPTable; +}; +} diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TxBodyConverter.cpp b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TxBodyConverter.cpp new file mode 100644 index 0000000000..ca4a195f46 --- /dev/null +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TxBodyConverter.cpp @@ -0,0 +1,695 @@ +#include "TxBodyConverter.h" +#include "../../../Common/MS-LCID.h" +#include "../../../ASCOfficeXlsFile2/source/XlsXlsxConverter/ShapeType.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/Colors/SchemeClr.h" +#include "StylesWriter.h" + +using namespace PPT_FORMAT; + +TxBodyConverter::TxBodyConverter(CShapeElement *pShapeElement, CRelsGenerator* pRels, TxBodyConverter::eTxType txType) : + m_pShapeElement(pShapeElement), m_pRels(pRels), m_txType(txType), + m_bWordArt(false) +{ + if (pShapeElement && pShapeElement->m_pShape) + pText = &pShapeElement->m_pShape->m_oText; + else + pText = nullptr; +} + +void TxBodyConverter::FillTxBody(PPTX::Logic::TxBody &oTxBody) +{ + if (m_pShapeElement == nullptr) + { + FillMergedTxBody(oTxBody); + return; + } + + switch (m_txType) + { + case shape: ConvertShapeTxBody(oTxBody); break; + case table: ConvertTableTxBody(oTxBody); break; + } +} + +void TxBodyConverter::ConvertTableTxBody(PPTX::Logic::TxBody &oTxBody) +{ + oTxBody.m_name = L"a:txBody"; + + + oTxBody.bodyPr = new PPTX::Logic::BodyPr; + FillBodyPr(oTxBody.bodyPr.get2()); + + + size_t nCount = pText->m_arParagraphs.size(); + if (nCount == 0) + { + oTxBody.lstStyle = new PPTX::Logic::TextListStyle; + PPTX::Logic::Paragraph paragraph; + unsigned sz = m_pShapeElement->m_rcChildAnchor.GetHeight() * 10; + paragraph.endParaRPr = getNewEndParaRPr(false, sz > 2000 ? 2000 : sz); + oTxBody.Paragrs.push_back(paragraph); + + return; + } + + + if (pText == nullptr) + return; + + + // todo + oTxBody.lstStyle = new PPTX::Logic::TextListStyle; + if (!m_bWordArt) + FillLstStyles(oTxBody.lstStyle.get2(), pText->m_oStyles); + + + for (size_t nIndexPar = 0; nIndexPar < nCount; ++nIndexPar) + { + PPTX::Logic::Paragraph p; + FillParagraph(p,pText->m_arParagraphs[nIndexPar]); + oTxBody.Paragrs.push_back(std::move(p)); + } + // if (m_pText) + // { + // FillLstStyles(oTxBody.lstStyle.get2(), m_pText->m_oStyles); + // FillParagraphs(oTxBody.Paragrs, m_pText->m_arParagraphs); + // } +} + +void TxBodyConverter::ConvertShapeTxBody(PPTX::Logic::TxBody &oTxBody) +{ + +} + +void TxBodyConverter::FillMergedTxBody(PPTX::Logic::TxBody &oTxBody) +{ + oTxBody.lstStyle = new PPTX::Logic::TextListStyle; + oTxBody.bodyPr = new PPTX::Logic::BodyPr; + oTxBody.lstStyle = new PPTX::Logic::TextListStyle; + + PPTX::Logic::Paragraph paragraph; + paragraph.endParaRPr = getNewEndParaRPr(); + oTxBody.Paragrs.push_back(paragraph); +} + +void TxBodyConverter::FillBodyPr(PPTX::Logic::BodyPr &oBodyPr) +{ + CDoubleRect oTextRect; + m_pShapeElement->m_pShape->GetTextRect(oTextRect); + + oBodyPr.lIns = oTextRect.left; + oBodyPr.rIns = oTextRect.right; + oBodyPr.tIns = oTextRect.top; + oBodyPr.bIns = oTextRect.bottom; + + + auto pAnchor = new PPTX::Limit::TextAnchor; + switch (pText->m_oAttributes.m_nTextAlignVertical) + { + case 0: pAnchor->set(L"t"); break; + case 2: pAnchor->set(L"b"); break; + default: + pAnchor->set(L"ctr"); + oBodyPr.anchorCtr = false; + } + oBodyPr.anchor = pAnchor; + + + if (m_pShapeElement->m_pShape->m_oText.m_bAutoFit) + oBodyPr.Fit.type = PPTX::Logic::TextFit::FitSpAuto; + + + if (pText->m_oAttributes.m_dTextRotate > 0) + oBodyPr.rot = round(pText->m_oAttributes.m_dTextRotate * 60000); + + + if (pText->m_nTextFlow >= 0) + { + auto *pVert = new PPTX::Limit::TextVerticalType; + switch(pText->m_nTextFlow) + { + case 1: + case 3: pVert->set(L"vert"); break; + case 2: pVert->set(L"vert270"); break; + case 5: pVert->set(L"wordArtVert"); break; + } + oBodyPr.vert = pVert; + } + else if (pText->m_bVertical) + { + auto *pVert = new PPTX::Limit::TextVerticalType; + pVert->set(L"eaVert"); + oBodyPr.vert = pVert; + } + + + std::wstring prstGeom = oox::Spt2ShapeType_mini((oox::MSOSPT)m_pShapeElement->m_lShapeType); + std::wstring prstTxWarp = oox::Spt2WordArtShapeType((oox::MSOSPT)m_pShapeElement->m_lShapeType); + if (prstGeom.size() && prstTxWarp.size()) + { + m_bWordArt = true; + + + auto pPrstTxWarp = new PPTX::Logic::PrstTxWarp; + pPrstTxWarp->prst.set(prstTxWarp); + + + CPPTShape *pPPTShape = dynamic_cast(m_pShapeElement->m_pShape->getBaseShape().get()); + std::wstring strVal; + + for (size_t i = 0 ; (pPPTShape) && (i < pPPTShape->m_arAdjustments.size()); i++) + { + PPTX::Logic::Gd gd; + switch(m_pShapeElement->m_lShapeType) + { + case oox::msosptTextFadeUp: + { + double kf = 4.63; //"волшебный" + std::wstring strVal = std::to_wstring(round(kf * pPPTShape->m_arAdjustments[i])); + + gd.fmla = L"val"; + gd.name = L"adj"; + pPrstTxWarp->avLst.push_back(std::move(gd)); + }break; + } + + } + + oBodyPr.prstTxWarp = pPrstTxWarp; + } +} + +void TxBodyConverter::FillLstStyles(PPTX::Logic::TextListStyle &oTLS, CTextStyles &oStyles) +{ + +} + +void TxBodyConverter::FillParagraph(PPTX::Logic::Paragraph &p, CParagraph ¶graph) +{ + p.pPr = new PPTX::Logic::TextParagraphPr; + FillPPr(p.pPr.get2(), paragraph); + + size_t nCountSpans = paragraph.m_arSpans.size(); + for (size_t nSpan = 0; nSpan < nCountSpans; ++nSpan) + { + if ((nSpan == (nCountSpans - 1)) && (_T("\n") == paragraph.m_arSpans[nSpan].m_strText || paragraph.m_arSpans[nSpan].m_strText.empty()) ) + { + PPT_FORMAT::CTextCFRun* pCF = ¶graph.m_arSpans[nSpan].m_oRun; + if ((pCF->Size.is_init()) && (pCF->Size.get() > 0) && (pCF->Size.get() < 4001)) + p.endParaRPr = getNewEndParaRPr(-1, (100 * pCF->Size.get()), L"en-US"); + else + p.endParaRPr = getNewEndParaRPr(-1, -1, L"en-US"); + + continue; + } + + + int span_sz = paragraph.m_arSpans[nSpan].m_strText.length() ; + if ((span_sz==1 && ( paragraph.m_arSpans[nSpan].m_strText[0] == (wchar_t)13 )) || + ((span_sz==2 && ( paragraph.m_arSpans[nSpan].m_strText[0] == (wchar_t)13 ) && + ( paragraph.m_arSpans[nSpan].m_strText[1] == (wchar_t)13 )))) + continue; + + + PPTX::Logic::RunElem runElem; + if (paragraph.m_arSpans[nSpan].m_bBreak) + { + auto pBr = new PPTX::Logic::Br; + pBr->rPr = new PPTX::Logic::RunProperties; + FillRPr(pBr->rPr.get2(), paragraph.m_arSpans[nSpan].m_oRun); + runElem.InitRun(pBr); + } else + { + auto pRun = new PPTX::Logic::Run(); + FillRun(*pRun, paragraph.m_arSpans[nSpan]); + runElem.InitRun(pRun); + + auto pFld = new PPTX::Logic::Fld; + if (m_pShapeElement->m_lPlaceholderType == PT_MasterSlideNumber/* && paragraph.m_arSpans[nSpan].m_bField*/) + { + pFld->id = L"{D038279B-FC19-497E-A7D1-5ADD9CAF016F}"; + pFld->type = L"slidenum"; + } else if (m_pShapeElement->m_lPlaceholderType == PT_MasterDate && m_pShapeElement->m_nFormatDate == 1/* && pParagraph->m_arSpans[nSpan].m_bField*/) + { + pFld->id = L"{D7E01130-044F-4930-9A27-C729C70D8524}"; + pFld->type = L"datetime1"; + } else { + delete pFld; + pFld = nullptr; + } + if (pFld) + { + PPTX::Logic::RunElem runElemFld; + runElemFld.InitRun(pFld); + p.RunElems.push_back(std::move(runElemFld)); + } + } + p.RunElems.push_back(std::move(runElem)); + } +} + +void TxBodyConverter::FillPPr(PPTX::Logic::TextParagraphPr &oPPr, CParagraph ¶graph) +{ + oPPr.lvl = paragraph.m_lTextLevel; + + + auto* pPF = &(paragraph.m_oPFRun); + if (pPF) + ConvertPFRun(oPPr, pPF); + +} + +void TxBodyConverter::ConvertPFRun(PPTX::Logic::TextParagraphPr &oPPr, CTextPFRun *pPF) +{ + if (pPF->textDirection.is_init()) + { + if (pPF->textDirection.get() == 1) oPPr.rtl = true; + else oPPr.rtl = false; + } + if (pPF->fontAlign.is_init()) + { + oPPr.fontAlgn = new PPTX::Limit::FontAlign; + oPPr.fontAlgn->set(CStylesWriter::GetFontAlign(pPF->fontAlign.get())); + } + + int leftMargin = 0; + if (pPF->leftMargin.is_init()) + { + leftMargin = pPF->leftMargin.get(); + oPPr.marL = leftMargin; + } + if (pPF->indent.is_init()) + { + oPPr.indent = pPF->indent.get() - leftMargin; + } + if (pPF->textAlignment.is_init()) + { + oPPr.algn = new PPTX::Limit::TextAlign; + oPPr.algn->set(CStylesWriter::GetTextAlign(pPF->textAlignment.get())); + } + if (pPF->defaultTabSize.is_init()) + { + oPPr.defTabSz = pPF->defaultTabSize.get(); + } + + ConvertTabStops(oPPr.tabLst, pPF->tabStops); + + if (pPF->lineSpacing.is_init()) + { + LONG val = pPF->lineSpacing.get(); + auto pLnSpc = new PPTX::Logic::TextSpacing; + pLnSpc->m_name = L"a:lnSpc"; + + if (val > 0) + pLnSpc->spcPct = val * 12.5; + else if (val < 0 && val > -13200) + pLnSpc->spcPct = val * -1000; + + oPPr.lnSpc = pLnSpc; + } + + if (pPF->spaceAfter.is_init()) + { + LONG val = pPF->spaceAfter.get(); + auto pSpcAft = new PPTX::Logic::TextSpacing; + pSpcAft->m_name = L"a:spcAft"; + if (val > 0) + pSpcAft->spcPts = round(12.5 * pPF->spaceAfter.get()); + else if (val < 0 && val > -13200) + pSpcAft->spcPts = val * -1000; + + oPPr.spcAft = pSpcAft; + } + if (pPF->spaceBefore.is_init()) + { + LONG val = pPF->spaceBefore.get(); + auto pSpcBef = new PPTX::Logic::TextSpacing; + pSpcBef->m_name = L"a:spcBef"; + if (val > 0) + pSpcBef->spcPts = round(12.5 * pPF->spaceBefore.get()); + else if (val < 0 && val > -13200) + pSpcBef->spcPts = val * -1000; + + oPPr.spcBef = pSpcBef; + } + + ConvertAllBullets(oPPr, pPF); +} + +void TxBodyConverter::ConvertTabStops(std::vector &arrTabs, std::vector > &arrTabStops) +{ + for (size_t t = 0 ; t < arrTabStops.size(); t++) + { + PPTX::Logic::Tab tab; + tab.pos = arrTabStops[t].first; + auto pAlgn = new PPTX::Limit::TextTabAlignType; + + switch (arrTabStops[t].second) + { + case 1: pAlgn->set(L"ctr"); break; + case 2: pAlgn->set(L"r"); break; + case 3: pAlgn->set(L"dec"); break; + default: pAlgn->set(L"l"); + } + tab.algn = pAlgn; + + arrTabs.push_back(tab); + } +} + +void TxBodyConverter::FillBuChar(PPTX::Logic::Bullet &oBullet, WCHAR symbol) +{ + auto pBuChar = new PPTX::Logic::BuChar; + pBuChar->Char.clear(); + pBuChar->Char.push_back(symbol); + oBullet.m_Bullet.reset(pBuChar); +} + +void TxBodyConverter::ConvertAllBullets(PPTX::Logic::TextParagraphPr &oPPr, CTextPFRun *pPF) +{ + + if (pPF->hasBullet.is_init()) + { + if (pPF->hasBullet.get()) + { + if (pPF->bulletColor.is_init()) + { + FillBuClr(oPPr.buColor, pPF->bulletColor.get()); + } + if (pPF->bulletSize.is_init()) + { + PPTX::WrapperWritingElement* pBuSize; + if (pPF->bulletSize.get() > 24 && pPF->bulletSize.get() < 401) + { + pBuSize = new PPTX::Logic::BuSzPct; + static_cast(pBuSize)->val = pPF->bulletSize.get() * 1000 ; + } + if (pPF->bulletSize.get() < 0 && pPF->bulletSize.get() > -4001) + { + pBuSize = new PPTX::Logic::BuSzPts; + static_cast(pBuSize)->val = - (pPF->bulletSize.get()); + } + oPPr.buSize.m_Size = pBuSize; + } + if (pPF->bulletFontProperties.is_init()) + { + auto pBuFont = new PPTX::Logic::TextFont; + pBuFont->m_name = L"a:buFont"; + pBuFont->typeface = pPF->bulletFontProperties->Name; + + if ( pPF->bulletFontProperties->PitchFamily > 0) + pBuFont->pitchFamily = std::to_wstring(pPF->bulletFontProperties->PitchFamily); + if ( pPF->bulletFontProperties->Charset > 0) + pBuFont->charset = std::to_wstring(pPF->bulletFontProperties->Charset); + + oPPr.buTypeface.m_Typeface.reset(pBuFont); + } + bool set = true; + if (pPF->bulletAutoNum.is_init()) + { + auto pBuAutoNum = new PPTX::Logic::BuAutoNum; + oPPr.ParagraphBullet.m_Bullet.reset(pBuAutoNum); + if (pPF->bulletAutoNum->startAt.is_init() && pPF->bulletAutoNum->startAt.get() != 1) + pBuAutoNum->startAt = pPF->bulletAutoNum->startAt.get(); + if (pPF->bulletAutoNum->type.is_init()) + pBuAutoNum->type = pPF->bulletAutoNum->type.get(); + set = false; + } + + if (pPF->bulletFontProperties.is_init() == false && pPF->bulletSize.is_init() == false) + { + auto pBuFont = new PPTX::Logic::BuFontTx; + oPPr.buTypeface.m_Typeface.reset(pBuFont); + if (pPF->bulletColor.is_init() == false) + set = false; + } + + if (pPF->bulletChar.is_init()) + { + FillBuChar(oPPr.ParagraphBullet, pPF->bulletChar.get()); + } else if (set) + { + FillBuChar(oPPr.ParagraphBullet, L'•'); + } + if (pPF->bulletColor.is_init()) + { + FillBuClr(oPPr.buColor, pPF->bulletColor.get()); + } + } + else + { + oPPr.buTypeface.m_Typeface.reset(new PPTX::Logic::BuNone); + } + } + +} + +void TxBodyConverter::FillBuClr(PPTX::Logic::BulletColor &oBuClr, CColor &oColor) +{ + auto pBuClr = new PPTX::Logic::BuClr; + pBuClr->Color.SetRGBColor(oColor.GetR(), oColor.GetG(), oColor.GetB()); + oBuClr.m_Color.reset(pBuClr); +} + +void TxBodyConverter::FillRun(PPTX::Logic::Run &oRun, CSpan &oSpan) +{ + oRun.SetText(oSpan.m_strText); + + oRun.rPr = new PPTX::Logic::RunProperties; + FillRPr(oRun.rPr.get2(), oSpan.m_oRun); +} + +PPTX::Logic::RunProperties *TxBodyConverter::getNewEndParaRPr(const int dirty, const int sz , const std::wstring& lang) +{ + auto pEndParaRPr = new PPTX::Logic::RunProperties; + pEndParaRPr->m_name = L"a:endParaRPr"; + + if (dirty == 0 || dirty == 1) + pEndParaRPr->dirty = (bool)dirty; + if (sz > 0) + pEndParaRPr->sz = sz; + if (lang.size()) + pEndParaRPr->lang = lang; + + return pEndParaRPr; +} + +void TxBodyConverter::FillRPr(PPTX::Logic::RunProperties &oRPr, CTextCFRun &oCFRun) +{ + oRPr.normalizeH = false; + if ((oCFRun.Size.is_init()) && (oCFRun.Size.get() > 0) && (oCFRun.Size.get() < 4001)) + { + oRPr.sz = int(100 * oCFRun.Size.get()); + } else + { + oRPr.sz = 1800; + } + if (oCFRun.BaseLineOffset.is_init()) + { + oRPr.baseline = int(1000 * oCFRun.BaseLineOffset.get()); + } + if (oCFRun.FontBold.is_init()) + { + oRPr.b = oCFRun.FontBold.get(); + } + else + { + oRPr.b = false; + } + if (oCFRun.FontItalic.is_init()) + { + oRPr.i = oCFRun.FontItalic.get(); + } + if (oCFRun.FontUnderline.is_init()) + { + oRPr.u = new PPTX::Limit::TextUnderline; + oRPr.u->set(oCFRun.FontUnderline.get() ? L"sng" : L"none"); + } + if (oCFRun.Language.is_init()) + { + std::wstring str_lang = msLCID2wstring(oCFRun.Language.get()); + + if (str_lang.length() > 0) + oRPr.lang = msLCID2wstring(oCFRun.Language.get()); + } + + + if (m_bWordArt) + {//порядок важен - линия, заливка, тень !!! + if (m_pShapeElement->m_bLine) + { + oRPr.ln = new PPTX::Logic::Ln; + ConvertLine(oRPr.ln.get2()); + } + // I don't know todo or not +// m_oWriter.WriteString(ConvertBrush(pShapeElement->m_oBrush)); +// m_oWriter.WriteString(ConvertShadow(pShapeElement->m_oShadow)); + } + else + { + if (oCFRun.Color.is_init()) + { + if (oCFRun.Color->m_lSchemeIndex != -1) + { + FillSchemeClr(oRPr.Fill, oCFRun.Color.get()); + } + else + { + FillSolidFill(oRPr.Fill, oCFRun.Color.get()); + } + } + } + + FillEffectLst(oRPr.EffectList, oCFRun); + if (oCFRun.Color.is_init()) + FillSolidFill(oRPr.Fill, oCFRun.Color.get()); + + + if (oCFRun.font.font.is_init()) + { + oRPr.latin = new PPTX::Logic::TextFont; + oRPr.latin->m_name = L"a:latin"; + oRPr.latin->typeface = oCFRun.font.font->Name; + oRPr.latin->charset = std::to_wstring(oCFRun.font.font->Charset); + oRPr.latin->pitchFamily = std::to_wstring(oCFRun.font.font->PitchFamily + 2); + } // todo else for fontRef.is_init() // it's theme + + if (oCFRun.font.ea.is_init()) + { + oRPr.ea = new PPTX::Logic::TextFont; + oRPr.ea->m_name = L"a:ea"; + oRPr.ea->typeface = oCFRun.font.ea->Name; + oRPr.ea->charset = std::to_wstring(oCFRun.font.ea->Charset); + } + if (oCFRun.font.sym.is_init()) + { + oRPr.sym = new PPTX::Logic::TextFont; + oRPr.sym->m_name = L"a:sym"; + oRPr.sym->typeface = oCFRun.font.sym->Name; + oRPr.sym->charset = std::to_wstring(oCFRun.font.sym->Charset); + } +} + +void TxBodyConverter::ConvertLine(PPTX::Logic::Ln &oLn) +{ + auto& oPen = m_pShapeElement->m_oPen; + oLn.cmpd = new PPTX::Limit::CompoundLine; + switch(oPen.LineStyle) + { + case 1: oLn.cmpd->set(L"dbl"); break; + case 2: oLn.cmpd->set(L"thickThin"); break; + case 3: oLn.cmpd->set(L"thinThick"); break; + case 4: oLn.cmpd->set(L"tri"); break; + } + + + oLn.w = oPen.Size; + FillSolidFill(oLn.Fill, oPen.Color); + + if (oPen.DashStyle > 0 && oPen.DashStyle < 11) + { + oLn.prstDash = new PPTX::Logic::PrstDash; + oLn.prstDash.get2().val = new PPTX::Limit::PrstDashVal; + auto& val = oLn.prstDash.get2().val; + switch(oPen.DashStyle) + { + case 1: val->set(L"sysDash"); break; + case 2: val->set(L"sysDot"); break; + case 3: val->set(L"sysDashDot"); break; + case 4: val->set(L"sysDashDotDot"); break; + case 5: val->set(L"dot"); break; + case 6: val->set(L"dash"); break; + case 7: val->set(L"lgDash"); break; + case 8: val->set(L"dashDot"); break; + case 9: val->set(L"lgDashDot"); break; + case 10: val->set(L"lgDashDotDot"); break; + } + } + + switch(oPen.LineJoin) + { + case 0: oLn.Join.type = PPTX::Logic::eJoin::JoinBevel; break; + case 1: oLn.Join.type = PPTX::Logic::eJoin::JoinMiter; break; + case 2: oLn.Join.type = PPTX::Logic::eJoin::JoinRound; break; + } + + oLn.headEnd = new PPTX::Logic::LineEnd; + oLn.tailEnd = new PPTX::Logic::LineEnd; + + ConvertLineEnd(oLn.headEnd.get2(), oPen.LineStartCap, oPen.LineStartLength, oPen.LineStartWidth, true); + ConvertLineEnd(oLn.tailEnd.get2(), oPen.LineEndCap, oPen.LineEndLength, oPen.LineEndWidth, false); +} + +void TxBodyConverter::ConvertLineEnd(PPTX::Logic::LineEnd &oLine, unsigned char cap, unsigned char length, unsigned char width, bool isHead) +{ + if (cap < 1) + return; + + if (isHead) + oLine.m_name = L"a:headEnd"; + else + oLine.m_name = L"a:tailEnd"; + + oLine.type = new PPTX::Limit::LineEndType; + switch(cap) + { + case 1: oLine.type->set(L"triangle"); break; + case 2: oLine.type->set(L"stealth"); break; + case 3: oLine.type->set(L"diamond"); break; + case 4: oLine.type->set(L"oval"); break; + case 5: oLine.type->set(L"arrow"); break; + } + + oLine.len = new PPTX::Limit::LineEndSize; + switch(length) + { + case 0: oLine.len->set(L"sm"); break; + case 1: oLine.len->set(L"med"); break; + case 2: oLine.len->set(L"lg"); break; + } + + oLine.w = new PPTX::Limit::LineEndSize; + switch(width) + { + case 0: oLine.w->set(L"sm"); break; + case 1: oLine.w->set(L"med"); break; + case 2: oLine.w->set(L"lg"); break; + } +} + +void TxBodyConverter::ConvertBrush(PPTX::Logic::RunProperties &oRPr) +{ + CBrush& brush = m_pShapeElement->m_oBrush; +} + +void TxBodyConverter::FillSolidFill(PPTX::Logic::UniFill &oUF, CColor &oColor) +{ + auto pSolidFill = new PPTX::Logic::SolidFill; + pSolidFill->Color.SetRGBColor(oColor.GetR(), oColor.GetG(), oColor.GetB()); + oUF.Fill.reset(pSolidFill); +} + +void TxBodyConverter::FillSchemeClr(PPTX::Logic::UniFill &oUF, CColor &oColor) +{ + auto pSolidFill = new PPTX::Logic::SolidFill; + auto pScheme = new PPTX::Logic::SchemeClr; + pScheme->val.set(CStylesWriter::GetColorInScheme(oColor.m_lSchemeIndex)); + pSolidFill->Color.Color.reset(pScheme); + oUF.Fill.reset(pSolidFill); +} + +void TxBodyConverter::FillEffectLst(PPTX::Logic::EffectProperties &oEList, CTextCFRun &oCFRun) +{ + auto pELst = new PPTX::Logic::EffectLst; + if (oCFRun.FontShadow.is_init() && oCFRun.FontShadow.get()) + { + pELst->outerShdw = new PPTX::Logic::OuterShdw; + pELst->outerShdw->blurRad = 38100; + pELst->outerShdw->dist = 38100; + pELst->outerShdw->dir = 2700000; + pELst->outerShdw->algn = new PPTX::Limit::RectAlign; + pELst->outerShdw->algn->set(L"tl"); + pELst->outerShdw->Color.SetRGBColor(0, 0, 0); + } + oEList.List.reset(pELst); +} diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TxBodyConverter.h b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TxBodyConverter.h new file mode 100644 index 0000000000..f670e6bd00 --- /dev/null +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/TxBodyConverter.h @@ -0,0 +1,91 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2019 + * + * 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 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * 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 + * + */ +#pragma once + +#include "../../../ASCOfficePPTXFile/Editor/Drawing/Elements.h" +#include "../../../ASCOfficePPTXFile/PPTXFormat/Logic/TxBody.h" +#include "ImageManager.h" + +namespace PPT_FORMAT +{ +class TxBodyConverter +{ +public: + enum eTxType + { + shape, + table + }; + TxBodyConverter(CShapeElement* pShapeElement, CRelsGenerator* pRels, eTxType txType); + + void FillTxBody(PPTX::Logic::TxBody& oTxBody); +private: + void ConvertTableTxBody(PPTX::Logic::TxBody& oTxBody); + void ConvertShapeTxBody(PPTX::Logic::TxBody& oTxBody); + void FillMergedTxBody(PPTX::Logic::TxBody& oTxBody); + +private: + void FillBodyPr(PPTX::Logic::BodyPr& oBodyPr); + void FillLstStyles(PPTX::Logic::TextListStyle& oTLS, CTextStyles& oStyles); + void FillParagraph(PPTX::Logic::Paragraph& p, CParagraph& paragraph); + void FillPPr(PPTX::Logic::TextParagraphPr& oPPr, CParagraph ¶graph); + void ConvertPFRun(PPTX::Logic::TextParagraphPr &oPPr, PPT_FORMAT::CTextPFRun* pPF); + void ConvertTabStops(std::vector& arrTabs, std::vector>& arrTabStops); + void FillBuChar(PPTX::Logic::Bullet& oBullet, WCHAR symbol); + void ConvertAllBullets(PPTX::Logic::TextParagraphPr &oPPr, CTextPFRun *pPF); + void FillBuClr(PPTX::Logic::BulletColor& oBuClr, CColor& oColor); + void FillRun(PPTX::Logic::Run& oRun, CSpan &oSpan); + PPTX::Logic::RunProperties* getNewEndParaRPr(const int dirty = -1, const int sz = -1, const std::wstring& lang = L""); + void FillRPr(PPTX::Logic::RunProperties& oRPr, CTextCFRun& oCFRun); + void ConvertLine(PPTX::Logic::Ln& oLn); + void ConvertLineEnd(PPTX::Logic::LineEnd& oLine, unsigned char cap, unsigned char length, unsigned char width, bool isHead); + void ConvertBrush(PPTX::Logic::RunProperties& oRPr); + void FillSolidFill(PPTX::Logic::UniFill& oUF, CColor& oColor); + void FillSchemeClr(PPTX::Logic::UniFill& oUF, CColor& oColor); + void FillEffectLst(PPTX::Logic::EffectProperties &oEList, CTextCFRun& oCFRun); + + + + void FillParagraphs(std::vector& arrP, std::vector& arrParagraphs); + void ConvertStyleLevel(PPTX::Logic::TextParagraphPr &oLevel, CTextStyleLevel& oOldLevel, const int& nLevel); + void FillEndParaRPr(PPTX::Logic::RunProperties& oEndPr, CTextPFRun& oPFRun); + void FillCS(PPTX::Logic::TextFont& oCs, CFontProperties& font); + +private: + CShapeElement* m_pShapeElement; + CRelsGenerator* m_pRels; + CTextAttributesEx* pText; + + eTxType m_txType; + bool m_bWordArt; +}; +} diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp index ecb1677e69..b2f038d0ad 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp @@ -403,14 +403,18 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) if (m_bMacros) { m_bMacros = false; - std::vector oArrayVba; - m_oDocument.GetRecordsByType(&oArrayVba, true, true); + std::vector oArrayDocInfo; + m_oDocument.GetRecordsByType(&oArrayDocInfo, true, true); - if (!oArrayVba.empty()) + CRecordVBAInfoAtom* pVbaAtom = nullptr; + if (!oArrayDocInfo.empty()) + pVbaAtom = oArrayDocInfo[0]->getVBAInfoAtom(); + + if (pVbaAtom) { - if (oArrayVba[0]->m_nHasMacros) + if (pVbaAtom->m_nHasMacros) { - nIndexPsrRef = m_mapOffsetInPIDs.find(oArrayVba[0]->m_nObjStgDataRef); + nIndexPsrRef = m_mapOffsetInPIDs.find(pVbaAtom->m_nObjStgDataRef); if (m_mapOffsetInPIDs.end() != nIndexPsrRef) { @@ -420,7 +424,7 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) POLE::Stream *pStreamTmp = pStream; if (m_pDecryptor) { - DecryptStream(pStream, oArrayVba[0]->m_nObjStgDataRef); + DecryptStream(pStream, pVbaAtom->m_nObjStgDataRef); pStreamTmp = m_arStreamDecrypt.back()->stream_; } oHeader.ReadFromStream(pStreamTmp); @@ -536,8 +540,8 @@ void CPPTUserInfo::FromDocument() if (oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom) { m_bHasDate = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasDate/* || - oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate || - oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate*/; + oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate || + oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate*/; m_bHasFooter = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasFooter; m_bHasSlideNumber = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasSlideNumber; @@ -731,8 +735,8 @@ void CPPTUserInfo::LoadNotes(_UINT32 dwNoteID, CSlide* pNotes) if (oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom) { bHasDate = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasDate/* || - oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate || - oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate*/; + oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate || + oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate*/; bHasFooter = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasFooter; bHasSlideNumber = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasSlideNumber; @@ -963,8 +967,8 @@ void CPPTUserInfo::LoadSlide(_UINT32 dwSlideID, CSlide* pSlide) if (oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom) { bHasDate = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasDate/* || - oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate || - oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate*/; + oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasTodayDate || + oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasUserDate*/; bHasFooter = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasFooter; bHasSlideNumber = oArrayHeadersFootersInfo[0]->m_oHeadersFootersAtom->m_bHasSlideNumber; @@ -1629,6 +1633,14 @@ void CPPTUserInfo::LoadMainMaster(_UINT32 dwMasterID) } int lLayoutID = AddNewLayout(pTheme, pMaster, false, true); + + for (auto& oMaster : m_mapMasters) + oMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); +// for (auto& oNoteMaster : m_mapNotesMasters) +// oNoteMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); +// for (auto& oHandoutMaster : m_mapHandoutMasters) +// oHandoutMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); + if (lLayoutID >= 0 && false == pTheme->m_arLayouts.empty()) { CLayout *pLayout_ = pTheme->m_arLayouts.back().get(); @@ -2369,36 +2381,72 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects) //-------------------------------------------------------------------- std::vector oArrayHyperlinkContainer; - pExObjects->GetRecordsByType(&oArrayHyperlinkContainer , true); - for (size_t nIndex = 0; nIndex < oArrayHyperlinkContainer.size(); ++nIndex) + for (const auto* pExHyperlink : oArrayHyperlinkContainer) { - std::vector oArrayHyperlink; - std::vector oArrayCString; + if (!pExHyperlink || !pExHyperlink->hasCString()) + continue; - oArrayHyperlinkContainer[nIndex]->GetRecordsByType (&oArrayHyperlink, false); - oArrayHyperlinkContainer[nIndex]->GetRecordsByType (&oArrayCString, false); + PPT_FORMAT::CExFilesInfo oInfo; + oInfo.m_dwID = pExHyperlink->m_exHyperlinkAtom.m_nHyperlinkID; - if (oArrayCString.size() > 0 && oArrayHyperlink.size() > 0) + bool wasSlide = false; +// bool wasLink = false; + + // it isn't normal that here we should catch slide number. + if (pExHyperlink->m_friendlyNameAtom.IsInit()) { - PPT_FORMAT::CExFilesInfo oInfo; - - oInfo.m_dwID = oArrayHyperlink[0]->m_nHyperlinkID; - for (size_t i = 0 ; i < oArrayCString.size(); i++) + std::wstring& recStr =pExHyperlink->m_friendlyNameAtom->m_strText; + int slideNum = oInfo.GetSlideNumber(recStr); + if (slideNum != -1) { - // Target atom. It's for eigher local and external files. - if (oArrayCString[i]->m_oHeader.RecInstance == 1) - oInfo.m_strFilePath = oArrayCString[i]->m_strText; - // Location atom. It's for slides or other local pp objects. - if (oArrayCString[i]->m_oHeader.RecInstance == 3) - oInfo.m_strLocation = oArrayCString[i]->m_strText; + oInfo.m_strFilePath = recStr; + oInfo.m_type = CExFilesInfo::ExFilesType::eftSlide; + m_oExMedia.m_arSlides.push_back(oInfo); + wasSlide = true; } - m_oExMedia.m_arHyperlinks.push_back(oInfo); } + + if (pExHyperlink->m_targetAtom.IsInit()) + { + std::wstring& recStr =pExHyperlink->m_targetAtom->m_strText; + oInfo.m_strFilePath = recStr; + if (oInfo.isAudioLink(recStr)) + { + oInfo.m_type = CExFilesInfo::ExFilesType::eftAudio; + m_oExMedia.m_arAudioCollection.push_back(oInfo); + }else if (oInfo.isHTTPLink(recStr)) + { + oInfo.m_type = CExFilesInfo::ExFilesType::eftHyperlink; + m_oExMedia.m_arHyperlinks.push_back(oInfo); + }else{ + oInfo.m_type = CExFilesInfo::ExFilesType::eftHyperlink; + m_oExMedia.m_arHyperlinks.push_back(oInfo); + } + } + + if (pExHyperlink->m_locationAtom.IsInit()) + { + // Here we need to write some records like file's path and slides + std::wstring& recStr = pExHyperlink->m_locationAtom->m_strText; + oInfo.m_strFilePath = recStr; + if (!wasSlide) + { + oInfo.m_type = CExFilesInfo::ExFilesType::eftSlide; + m_oExMedia.m_arSlides.push_back(oInfo); + } else if (!m_oExMedia.m_arSlides.empty()) + { + oInfo.m_type = CExFilesInfo::ExFilesType::eftSlide; + m_oExMedia.m_arSlides.back().m_strFilePath = recStr; + } + } + } } + + void CPPTUserInfo::LoadExVideo(CRecordsContainer* pExObject) { std::vector oArrayExMedia; @@ -2505,7 +2553,7 @@ void CPPTUserInfo::AddAudioTransition (_UINT32 refID, CTransition* pTransition, std::wstring audioName = strRecord->m_strText; ; -// audioName.erase(audioName.find(L"."), audioName.end()); todo + // audioName.erase(audioName.find(L"."), audioName.end()); todo if (strRecord) pTransition->m_oAudio.m_sImageName = audioName; diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.cpp b/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.cpp index 04894510a2..75cd2e568b 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.cpp @@ -517,7 +517,7 @@ void CTextCFRunRecord::LoadFromStream(POLE::Stream* pStream, bool bIsIndentation namespace PPT_FORMAT { void ConvertPPTTextToEditorStructure(std::vector& oArrayPF, std::vector& oArrayCF, - std::wstring& strText, PPT_FORMAT::CTextAttributesEx& oAttributes) + std::wstring& strText, PPT_FORMAT::CTextAttributesEx& oAttributes) { int nCountPFs = (int)oArrayPF.size(); int nCountCFs = (int)oArrayCF.size(); diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.h b/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.h index 358418307b..5b61b55547 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.h +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/ReadStructures.h @@ -342,6 +342,6 @@ public: namespace PPT_FORMAT { - void ConvertPPTTextToEditorStructure(std::vector& oArrayPF, std::vector& oArrayCF, - std::wstring& strText, PPT_FORMAT::CTextAttributesEx& oAttributes); + void ConvertPPTTextToEditorStructure(std::vector& oArrayPF, std::vector& oArrayCF, + std::wstring& strText, PPT_FORMAT::CTextAttributesEx& oAttributes); } diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/Records.cpp b/ASCOfficePPTFile/PPTFormatLib/Reader/Records.cpp index 654a700b85..213fee10f9 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/Records.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/Records.cpp @@ -528,7 +528,8 @@ IRecord* CreateByType(SRecordHeader oHeader) //CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPSHAPEID12 , CRecordRoundTripShapeId12Atom) CREATE_BY_TYPE(RT_RoundTripHFPlaceholder12Atom , CRecordRoundTripHFPlaceholder12Atom) //CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPCONTENTMASTERID , CRecordRoundTripContentMasterId12Atom) - //CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPOARTTEXTSTYLES12 , CRecordRoundTripOArtTextStyles12Atom) + + CREATE_BY_TYPE(RT_RoundTripOArtTextStyles12Atom , CRecordRoundTripOArtTextStyles12Atom) CREATE_BY_TYPE(RT_RoundTripHeaderFooterDefaults12Atom , CRecordRoundTripHeaderFooterDefaults12Atom) CREATE_BY_TYPE(RT_RoundTripNotesMasterTextStyles12Atom , CRecordRoundTripNotesMasterTextStyles12Atom) //CREATE_BY_TYPE(RECORD_TYPE_ROUNDTRIPDOCFLAGS12 , CRecordRoundTripDocFlags12Atom) @@ -613,6 +614,8 @@ IRecord* CreateByType(SRecordHeader oHeader) CREATE_BY_TYPE(RTE_SPLITMENUCOLORS , CRecordSplitMenuColorRecord) CREATE_BY_TYPE(RTE_COLORMRU , CRecordMostRecentlyUserColors) CREATE_BY_TYPE(RTE_CLIENTDATA , CRecordOfficeArtClientData) + CREATE_BY_TYPE(RTE_CLIENTTEXTBOX , CRecordOfficeArtClientTextbox) + CREATE_BY_TYPE(RT_ExternalCdAudio , CRecordExCDAudioContainer) CREATE_BY_TYPE(RT_ExternalWavAudioLink , CRecordWAVAudioLinkContainer) @@ -624,6 +627,7 @@ IRecord* CreateByType(SRecordHeader oHeader) // интерактив CREATE_BY_TYPE(RT_InteractiveInfoAtom , CRecordInteractiveInfoAtom) CREATE_BY_TYPE(RT_TextInteractiveInfoAtom , CRecordTextInteractiveInfoAtom) + CREATE_BY_TYPE(RT_InteractiveInfo , CRecordMouseInteractiveInfoContainer) // читаем для анимации @@ -632,15 +636,14 @@ IRecord* CreateByType(SRecordHeader oHeader) CREATE_BY_TYPE(RT_Sound , CRecordSoundContainer) CREATE_BY_TYPE(RT_SoundDataBlob , CRecordSoundDataBlob) - + CREATE_BY_TYPE(RT_MetaFile , CRecordMetafileBlob) default: { +// std::cout << GetRecordName(oHeader.RecType) << ": " << oHeader.RecLen << "\n"; }break; }; -// std::cout << GetRecordName(oHeader.RecType) << ": " << oHeader.RecLen << "\n"; - if (NULL == pRecord) { diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/Records.h b/ASCOfficePPTFile/PPTFormatLib/Reader/Records.h index e4dbba8ad8..728d75dc86 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/Records.h +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/Records.h @@ -225,7 +225,7 @@ public: virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream); template - void GetRecordsByType(std::vector* pArray, bool bIsChild, bool bOnlyFirst = false) + void GetRecordsByType(std::vector* pArray, bool bIsChild, bool bOnlyFirst = false) const { if (NULL == pArray) return; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/CString.h b/ASCOfficePPTFile/PPTFormatLib/Records/CString.h index 4961a5a5f6..36b18000aa 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/CString.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/CString.h @@ -31,6 +31,7 @@ */ #pragma once #include "../Reader/Records.h" +#include class CRecordCString : public CUnknownRecord { @@ -48,7 +49,7 @@ public: virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) { m_oHeader = oHeader; - m_strText = StreamUtils::ReadStringW(pStream, m_oHeader.RecLen / 2); + m_strText = StreamUtils::ReadStringW(pStream, m_oHeader.RecLen / 2); } -}; \ No newline at end of file +}; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/DocInfoListContainer.h b/ASCOfficePPTFile/PPTFormatLib/Records/DocInfoListContainer.h index 1532958c53..5a886db91c 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/DocInfoListContainer.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/DocInfoListContainer.h @@ -32,6 +32,7 @@ #pragma once #include "DocProgTagsContainer.h" +#include "VBAInfoAtom.h" namespace PPT_FORMAT { @@ -46,7 +47,13 @@ public: { case RT_ProgTags: { - m_record = new CRecordDocProgTagsContainer; + m_record.reset(new CRecordDocProgTagsContainer); + m_record->ReadFromStream(oHeader, pStream); + break; + } + case RT_VbaInfo: + { + m_record.reset(new CRecordVBAInfoContainer); m_record->ReadFromStream(oHeader, pStream); break; } @@ -105,5 +112,20 @@ public: } StreamUtils::StreamSeek(lPos + m_oHeader.RecLen, pStream); } + + CRecordVBAInfoAtom* getVBAInfoAtom()const + { + for (const auto* pChild : m_rgChildRec) + { + if (!pChild || !pChild->m_record.IsInit()) + continue; + IRecord* pRecord = pChild->m_record.GetPointer(); + auto* pVBA = dynamic_cast(pRecord); + if (pVBA) + return static_cast(pVBA->m_arRecords[0]); + } + + return nullptr; + } }; } diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.cpp b/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.cpp index cd572d0686..cd8251c88c 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.cpp @@ -39,90 +39,91 @@ #include "../../../../Common/DocxFormat/Source/Base/Types_32.h" #include "../../../../OfficeUtils/src/OfficeUtils.h" +#include #include "../../Enums/_includer.h" - - #define FIXED_POINT_unsigned(val) (double)((WORD)(val >> 16) + ((WORD)(val) / 65536.0)) +ULONG xmlName = 1; + bool CPPTElement::ChangeBlack2ColorImage(std::wstring image_path, int rgbColor1, int rgbColor2) { - CBgraFrame bgraFrame; + CBgraFrame bgraFrame; - if (bgraFrame.OpenFile(image_path)) - { - int smpl = abs(bgraFrame.get_Stride() / bgraFrame.get_Width()); + if (bgraFrame.OpenFile(image_path)) + { + int smpl = abs(bgraFrame.get_Stride() / bgraFrame.get_Width()); - BYTE * rgb = bgraFrame.get_Data(); - - BYTE R1 = (BYTE)(rgbColor1); - BYTE G1 = (BYTE)(rgbColor1 >> 8); - BYTE B1 = (BYTE)(rgbColor1 >> 16); + BYTE * rgb = bgraFrame.get_Data(); - BYTE R2 = (BYTE)(rgbColor2); - BYTE G2 = (BYTE)(rgbColor2 >> 8); - BYTE B2 = (BYTE)(rgbColor2 >> 16); + BYTE R1 = (BYTE)(rgbColor1); + BYTE G1 = (BYTE)(rgbColor1 >> 8); + BYTE B1 = (BYTE)(rgbColor1 >> 16); - for (int i = 0 ; i < bgraFrame.get_Width() * bgraFrame.get_Height(); i++) - { - if (rgb[i * smpl + 0 ] == 0x00 && rgb[i * smpl + 1 ] == 0x00 && rgb[i * smpl + 2 ] == 0x00) - { - rgb[i * smpl + 0 ] = R1; - rgb[i * smpl + 1 ] = G1; - rgb[i * smpl + 2 ] = B1; - } - else - { - rgb[i * smpl + 0 ] = R2; - rgb[i * smpl + 1 ] = G2; - rgb[i * smpl + 2 ] = B2; - } - } - bgraFrame.SaveFile(image_path, 1); - return true; - } - return false; + BYTE R2 = (BYTE)(rgbColor2); + BYTE G2 = (BYTE)(rgbColor2 >> 8); + BYTE B2 = (BYTE)(rgbColor2 >> 16); + + for (int i = 0 ; i < bgraFrame.get_Width() * bgraFrame.get_Height(); i++) + { + if (rgb[i * smpl + 0 ] == 0x00 && rgb[i * smpl + 1 ] == 0x00 && rgb[i * smpl + 2 ] == 0x00) + { + rgb[i * smpl + 0 ] = R1; + rgb[i * smpl + 1 ] = G1; + rgb[i * smpl + 2 ] = B1; + } + else + { + rgb[i * smpl + 0 ] = R2; + rgb[i * smpl + 1 ] = G2; + rgb[i * smpl + 2 ] = B2; + } + } + bgraFrame.SaveFile(image_path, 1); + return true; + } + return false; } CColor CPPTElement::CorrectSysColor(int nColorCode, CElementPtr pElement, CTheme* pTheme) { - if (!pElement) return CColor(); + if (!pElement) return CColor(); - CColor color; + CColor color; - unsigned short nParameter = (unsigned short)(( nColorCode >> 16 ) & 0x00ff); // the HiByte of nParameter is not zero, an exclusive AND is helping :o - unsigned short nFunctionBits = (unsigned short)(( nColorCode & 0x00000f00 ) >> 8 ); - unsigned short nAdditionalFlags = (unsigned short)(( nColorCode & 0x0000f000) >> 8 ); - unsigned short nColorIndex = (unsigned short) ( nColorCode & 0x00ff); - unsigned short nPropColor = 0; + unsigned short nParameter = (unsigned short)(( nColorCode >> 16 ) & 0x00ff); // the HiByte of nParameter is not zero, an exclusive AND is helping :o + unsigned short nFunctionBits = (unsigned short)(( nColorCode & 0x00000f00 ) >> 8 ); + unsigned short nAdditionalFlags = (unsigned short)(( nColorCode & 0x0000f000) >> 8 ); + unsigned short nColorIndex = (unsigned short) ( nColorCode & 0x00ff); + unsigned short nPropColor = 0; - switch (nColorIndex) - { - case 0xF0: color = pElement->m_oBrush.Color1; break; - case 0xF1: - { - if (pElement->m_bLine) color = pElement->m_oPen.Color; - else color = pElement->m_oBrush.Color1; - }break; - case 0xF2: color = pElement->m_oPen.Color; break; - case 0xF3: color = pElement->m_oShadow.Color; break; - case 0xF4: break; ///this - case 0xF5: color = pElement->m_oBrush.Color2; break; - case 0xF6: break; //lineBackColor - case 0xF7: //FillThenLine - case 0xF8: //colorIndexMask - color = pElement->m_oBrush.Color1; break; - default: - //from table - break; - } + switch (nColorIndex) + { + case 0xF0: color = pElement->m_oBrush.Color1; break; + case 0xF1: + { + if (pElement->m_bLine) color = pElement->m_oPen.Color; + else color = pElement->m_oBrush.Color1; + }break; + case 0xF2: color = pElement->m_oPen.Color; break; + case 0xF3: color = pElement->m_oShadow.Color; break; + case 0xF4: break; ///this + case 0xF5: color = pElement->m_oBrush.Color2; break; + case 0xF6: break; //lineBackColor + case 0xF7: //FillThenLine + case 0xF8: //colorIndexMask + color = pElement->m_oBrush.Color1; break; + default: + //from table + break; + } if (color.m_lSchemeIndex != -1 && (int)pTheme->m_arColorScheme.size() > color.m_lSchemeIndex) - { - //вытащить цвет ( + { + //вытащить цвет ( - color = pTheme->m_arColorScheme[color.m_lSchemeIndex]; - } + color = pTheme->m_arColorScheme[color.m_lSchemeIndex]; + } //if ( nCProp && ( nPropColor & 0x10000000 ) == 0 ) // beware of looping recursive // color = CorrectSysColor( nPropColor, pElement); @@ -130,66 +131,66 @@ CColor CPPTElement::CorrectSysColor(int nColorCode, CElementPtr pElement, CTheme if( nAdditionalFlags & 0x80 ) // make color gray { BYTE nZwi = 0x7f;//= aColor.GetLuminance(); - color.SetRGB(nZwi, nZwi, nZwi); + color.SetRGB(nZwi, nZwi, nZwi); } switch( nFunctionBits ) { - case 0x01 : // darken color by parameter - { - color.SetR ( static_cast ( ( nParameter * color.GetR() ) >> 8 ) ); - color.SetG ( static_cast ( ( nParameter * color.GetG() ) >> 8 ) ); - color.SetB ( static_cast ( ( nParameter * color.GetB() ) >> 8 ) ); - } + case 0x01 : // darken color by parameter + { + color.SetR ( static_cast ( ( nParameter * color.GetR() ) >> 8 ) ); + color.SetG ( static_cast ( ( nParameter * color.GetG() ) >> 8 ) ); + color.SetB ( static_cast ( ( nParameter * color.GetB() ) >> 8 ) ); + } break; - case 0x02 : // lighten color by parameter - { - unsigned short nInvParameter = ( 0x00ff - nParameter ) * 0xff; - color.SetR( static_cast( ( nInvParameter + ( nParameter * color.GetR() ) ) >> 8 ) ); - color.SetG( static_cast( ( nInvParameter + ( nParameter * color.GetG() ) ) >> 8 ) ); - color.SetB( static_cast( ( nInvParameter + ( nParameter * color.GetB() ) ) >> 8 ) ); - } + case 0x02 : // lighten color by parameter + { + unsigned short nInvParameter = ( 0x00ff - nParameter ) * 0xff; + color.SetR( static_cast( ( nInvParameter + ( nParameter * color.GetR() ) ) >> 8 ) ); + color.SetG( static_cast( ( nInvParameter + ( nParameter * color.GetG() ) ) >> 8 ) ); + color.SetB( static_cast( ( nInvParameter + ( nParameter * color.GetB() ) ) >> 8 ) ); + } break; - case 0x03 : // add grey level RGB(p,p,p) - { - short nR = (short)color.GetR() + (short)nParameter; - short nG = (short)color.GetG() + (short)nParameter; - short nB = (short)color.GetB() + (short)nParameter; + case 0x03 : // add grey level RGB(p,p,p) + { + short nR = (short)color.GetR() + (short)nParameter; + short nG = (short)color.GetG() + (short)nParameter; + short nB = (short)color.GetB() + (short)nParameter; - if ( nR > 0x00ff ) nR = 0x00ff; - if ( nG > 0x00ff ) nG = 0x00ff; - if ( nB > 0x00ff ) nB = 0x00ff; + if ( nR > 0x00ff ) nR = 0x00ff; + if ( nG > 0x00ff ) nG = 0x00ff; + if ( nB > 0x00ff ) nB = 0x00ff; - color.SetRGB( (BYTE)nR, (BYTE)nG, (BYTE)nB ); - } + color.SetRGB( (BYTE)nR, (BYTE)nG, (BYTE)nB ); + } break; - case 0x04 : // substract grey level RGB(p,p,p) - { - short nR = (short)color.GetR() - (short)nParameter; - short nG = (short)color.GetG() - (short)nParameter; - short nB = (short)color.GetB() - (short)nParameter; - if ( nR < 0 ) nR = 0; - if ( nG < 0 ) nG = 0; - if ( nB < 0 ) nB = 0; - color.SetRGB( (BYTE)nR, (BYTE)nG, (BYTE)nB ); - } + case 0x04 : // substract grey level RGB(p,p,p) + { + short nR = (short)color.GetR() - (short)nParameter; + short nG = (short)color.GetG() - (short)nParameter; + short nB = (short)color.GetB() - (short)nParameter; + if ( nR < 0 ) nR = 0; + if ( nG < 0 ) nG = 0; + if ( nB < 0 ) nB = 0; + color.SetRGB( (BYTE)nR, (BYTE)nG, (BYTE)nB ); + } break; - case 0x05 : // substract from gray level RGB(p,p,p) - { - short nR = (short)nParameter - (short)color.GetR(); - short nG = (short)nParameter - (short)color.GetG(); - short nB = (short)nParameter - (short)color.GetB(); - if ( nR < 0 ) nR = 0; - if ( nG < 0 ) nG = 0; - if ( nB < 0 ) nB = 0; - color.SetRGB( (BYTE)nR, (BYTE)nG, (BYTE)nB ); - } + case 0x05 : // substract from gray level RGB(p,p,p) + { + short nR = (short)nParameter - (short)color.GetR(); + short nG = (short)nParameter - (short)color.GetG(); + short nB = (short)nParameter - (short)color.GetB(); + if ( nR < 0 ) nR = 0; + if ( nG < 0 ) nG = 0; + if ( nB < 0 ) nB = 0; + color.SetRGB( (BYTE)nR, (BYTE)nG, (BYTE)nB ); + } break; - case 0x06 : // per component: black if < p, white if >= p - { - color.SetR( color.GetR() < nParameter ? 0x00 : 0xff ); - color.SetG( color.GetG() < nParameter ? 0x00 : 0xff ); - color.SetB( color.GetB() < nParameter ? 0x00 : 0xff ); - } + case 0x06 : // per component: black if < p, white if >= p + { + color.SetR( color.GetR() < nParameter ? 0x00 : 0xff ); + color.SetG( color.GetG() < nParameter ? 0x00 : 0xff ); + color.SetB( color.GetB() < nParameter ? 0x00 : 0xff ); + } break; } if ( nAdditionalFlags & 0x40 ) // top-bit invert @@ -198,1294 +199,1300 @@ CColor CPPTElement::CorrectSysColor(int nColorCode, CElementPtr pElement, CTheme if ( nAdditionalFlags & 0x20 ) // invert color color.SetRGB(0xff - color.GetR(), 0xff - color.GetG(), 0xff - color.GetB()); - return color; + return color; } void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideInfo* pWrapper, CSlide* pSlide, CProperties* pProperties, bool reset_default) { - size_t lCount = pProperties->m_lCount; - switch (pElement->m_etType) - { - case PPT_FORMAT::etVideo: - { - if (reset_default) - { - pElement->m_bLine = false; - } - for (size_t i = 0; i < lCount; ++i) - { - SetUpPropertyVideo(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - break; - } - case PPT_FORMAT::etPicture: - { - if (reset_default) - { - pElement->m_oBrush.Type = c_BrushTypeTexture; - pElement->m_bLine = false; - } - for (size_t i = 0; i < lCount; ++i) - { - SetUpPropertyImage(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - break; - } - case PPT_FORMAT::etAudio: - { - if (reset_default) - { - pElement->m_bLine = false; - } - for (size_t i = 0; i < lCount; ++i) - { - SetUpPropertyAudio(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - break; - } - case PPT_FORMAT::etGroup: - { - if (reset_default) - { - pElement->m_bLine = false; - pElement->m_bIsFilled = false; - } - for (size_t i = 0; i < lCount; ++i) - { - SetUpProperty(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - }break; - case PPT_FORMAT::etShape: - { - CShapeElement* pShapeElem = dynamic_cast(pElement.get()); - CPPTShape* pPPTShape = dynamic_cast(pShapeElem->m_pShape->getBaseShape().get()); + size_t lCount = pProperties->m_lCount; + switch (pElement->m_etType) + { + case PPT_FORMAT::etVideo: + { + if (reset_default) + { + pElement->m_bLine = false; + } + for (size_t i = 0; i < lCount; ++i) + { + SetUpPropertyVideo(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); + } + break; + } + case PPT_FORMAT::etPicture: + { + if (reset_default) + { + pElement->m_oBrush.Type = c_BrushTypeTexture; + pElement->m_bLine = false; + } + for (size_t i = 0; i < lCount; ++i) + { + SetUpPropertyImage(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); + } + break; + } + case PPT_FORMAT::etAudio: + { + if (reset_default) + { + pElement->m_bLine = false; + } + for (size_t i = 0; i < lCount; ++i) + { + SetUpPropertyAudio(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); + } + break; + } + case PPT_FORMAT::etGroup: + { + if (reset_default) + { + pElement->m_bLine = false; + pElement->m_bIsFilled = false; + } + for (size_t i = 0; i < lCount; ++i) + { + SetUpProperty(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); + } + }break; + case PPT_FORMAT::etShape: + { + CShapeElement* pShapeElem = dynamic_cast(pElement.get()); + CPPTShape* pPPTShape = dynamic_cast(pShapeElem->m_pShape->getBaseShape().get()); - if (NULL != pPPTShape) - { - pPPTShape->m_oCustomVML.SetAdjusts(&pPPTShape->m_arAdjustments); - } + if (NULL != pPPTShape) + { + pPPTShape->m_oCustomVML.SetAdjusts(&pPPTShape->m_arAdjustments); + } - for (size_t i = 0; i < lCount; ++i) - { - SetUpPropertyShape(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } + for (size_t i = 0; i < lCount; ++i) + { + SetUpPropertyShape(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); + } - if (false == pElement->m_bIsFilled) - { - pElement->m_oBrush.Type = c_BrushTypeNoFill; - } - else if (pElement->m_oBrush.Type == c_BrushTypeNotSet && - (pElement->m_lPlaceholderType == 0 && pElement->m_lPlaceholderID < 0 )) - { - pElement->m_oBrush.Type = c_BrushTypeSolid; - } + if (false == pElement->m_bIsFilled) + { + pElement->m_oBrush.Type = c_BrushTypeNoFill; + } + else if (pElement->m_oBrush.Type == c_BrushTypeNotSet && + (pElement->m_lPlaceholderType == 0 && pElement->m_lPlaceholderID < 0 )) + { + pElement->m_oBrush.Type = c_BrushTypeSolid; + } - if (NULL != pPPTShape) - { - pPPTShape->m_oCustomVML.ToCustomShape(pPPTShape, pPPTShape->m_oManager); - pPPTShape->ReCalculate(); - } - break; - } - default: - break; - } + if (NULL != pPPTShape) + { + pPPTShape->m_oCustomVML.ToCustomShape(pPPTShape, pPPTShape->m_oManager); + pPPTShape->ReCalculate(); + } + break; + } + default: + break; + } } void CPPTElement::SetUpProperty(CElementPtr pElement, CTheme* pTheme, CSlideInfo* pInfo, CSlide* pSlide, CProperty* pProperty) { - switch (pProperty->m_ePID) - { - case wzName: - { - pElement->m_sName = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue /2 - 1); - }break; - case wzDescription: - { - pElement->m_sDescription = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue /2 - 1); - }break; - case hspMaster: - { - pElement->m_lLayoutID = (LONG)pProperty->m_lValue; - }break; - case ePropertyId_rotation: - { - pElement->m_dRotate = FixedPointToDouble(pProperty->m_lValue); - }break; - case ePropertyId_fFlipH: - { - BYTE flag1 = (BYTE)pProperty->m_lValue; - BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); + switch (pProperty->m_ePID) + { + case wzName: + { + pElement->m_sName = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue /2 - 1); + }break; + case wzDescription: + { + pElement->m_sDescription = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue /2 - 1); + }break; + case hspMaster: + { + pElement->m_lLayoutID = (LONG)pProperty->m_lValue; + }break; + case ePropertyId_rotation: + { + pElement->m_dRotate = FixedPointToDouble(pProperty->m_lValue); + }break; + case ePropertyId_fFlipH: + { + BYTE flag1 = (BYTE)pProperty->m_lValue; + BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); - bool bFlipH = (0x01 == (0x01 & flag1)); - bool bFlipV = (0x02 == (0x02 & flag1)); + bool bFlipH = (0x01 == (0x01 & flag1)); + bool bFlipV = (0x02 == (0x02 & flag1)); - bool bUseFlipH = (0x01 == (0x01 & flag3)); - bool bUseFlipV = (0x02 == (0x02 & flag3)); + bool bUseFlipH = (0x01 == (0x01 & flag3)); + bool bUseFlipV = (0x02 == (0x02 & flag3)); - if (bUseFlipH) - pElement->m_bFlipH = bFlipH; + if (bUseFlipH) + pElement->m_bFlipH = bFlipH; - if (bUseFlipV) - pElement->m_bFlipV = bFlipV; - }break; - case fillType: - { - _UINT32 dwType = pProperty->m_lValue; - switch(dwType) - { - case ODRAW::fillPattern: - { - pElement->m_oBrush.Type = c_BrushTypePattern; - //texture + change black to color2, white to color1 - }break; - case ODRAW::fillTexture : - case ODRAW::fillPicture : - { - pElement->m_oBrush.Type = c_BrushTypeTexture; - pElement->m_oBrush.TextureMode = (ODRAW::fillPicture == dwType) ? c_BrushTextureModeStretch : c_BrushTextureModeTile; - }break; - case ODRAW::fillShadeCenter://1 color - case ODRAW::fillShadeShape: - { - pElement->m_oBrush.Type = c_BrushTypeCenter; - }break;// - case ODRAW::fillShadeTitle://2 colors and more - case ODRAW::fillShade : - case ODRAW::fillShadeScale: - { - pElement->m_oBrush.Type = c_BrushTypePathGradient1; - }break; - case ODRAW::fillBackground: - { - pElement->m_oBrush.Type = c_BrushTypeNoFill; - }break; - } - }break; - case fillBlip: - { - int dwOffset = 0 ; - - if (pProperty->m_bComplex) - { - //inline - dwOffset = -1; - } - else - { - dwOffset = pInfo->GetIndexPicture(pProperty->m_lValue); - } - int nLen = pElement->m_oBrush.TexturePath.length() - 1; - int nIndex = pElement->m_oBrush.TexturePath.rfind(FILE_SEPARATOR_CHAR); - if (nLen != nIndex) - { - pElement->m_oBrush.TexturePath.erase(nIndex + 1, nLen - nIndex); - } - - pElement->m_oBrush.TexturePath = pElement->m_oBrush.TexturePath + pInfo->GetFileNamePicture(dwOffset); - if (pElement->m_oBrush.Type == c_BrushTypePattern) - { - int rgbColor1 = 0xFFFFFF; - int rgbColor2 = 0; + if (bUseFlipV) + pElement->m_bFlipV = bFlipV; + }break; + case fillType: + { + _UINT32 dwType = pProperty->m_lValue; + switch(dwType) + { + case ODRAW::fillPattern: + { + pElement->m_oBrush.Type = c_BrushTypePattern; + //texture + change black to color2, white to color1 + }break; + case ODRAW::fillTexture : + case ODRAW::fillPicture : + { + pElement->m_oBrush.Type = c_BrushTypeTexture; + pElement->m_oBrush.TextureMode = (ODRAW::fillPicture == dwType) ? c_BrushTextureModeStretch : c_BrushTextureModeTile; + }break; + case ODRAW::fillShadeCenter://1 color + case ODRAW::fillShadeShape: + { + pElement->m_oBrush.Type = c_BrushTypeCenter; + }break;// + case ODRAW::fillShadeTitle://2 colors and more + case ODRAW::fillShade : + case ODRAW::fillShadeScale: + { + pElement->m_oBrush.Type = c_BrushTypePathGradient1; + }break; + case ODRAW::fillBackground: + { + pElement->m_oBrush.Type = c_BrushTypeNoFill; + }break; + } + }break; + case fillBlip: + { + int dwOffset = 0 ; - if (pElement->m_oBrush.Color1.m_lSchemeIndex == -1) - { - rgbColor1 = pElement->m_oBrush.Color1.GetLONG_RGB(); - } - else - { - if ((pSlide) && (pSlide->m_arColorScheme.size() > 0)) - { - rgbColor1 = pSlide->m_arColorScheme[pElement->m_oBrush.Color1.m_lSchemeIndex].GetLONG_RGB(); - } - else if ((pTheme) && (pTheme->m_arColorScheme.size() > 0)) - { - rgbColor1 = pTheme->m_arColorScheme[pElement->m_oBrush.Color1.m_lSchemeIndex].GetLONG_RGB(); - } - } - if (pElement->m_oBrush.Color2.m_lSchemeIndex == -1) - { - rgbColor2 = pElement->m_oBrush.Color2.GetLONG_RGB(); - } - else - { - if ((pSlide) && (pSlide->m_arColorScheme.size() > 0)) - { - rgbColor2 = pSlide->m_arColorScheme[pElement->m_oBrush.Color2.m_lSchemeIndex].GetLONG_RGB(); - } - else if ((pTheme) && (pTheme->m_arColorScheme.size() > 0)) - { - rgbColor2 = pTheme->m_arColorScheme[pElement->m_oBrush.Color2.m_lSchemeIndex].GetLONG_RGB(); - } - } - ChangeBlack2ColorImage(pElement->m_oBrush.TexturePath, rgbColor2, rgbColor1); - - pElement->m_oBrush.Type = c_BrushTypeTexture; - pElement->m_oBrush.TextureMode = c_BrushTextureModeTile; - } - }break; - case fillColor: - { - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); + if (pProperty->m_bComplex) + { + //inline + dwOffset = -1; + } + else + { + dwOffset = pInfo->GetIndexPicture(pProperty->m_lValue); + } + int nLen = pElement->m_oBrush.TexturePath.length() - 1; + int nIndex = pElement->m_oBrush.TexturePath.rfind(FILE_SEPARATOR_CHAR); + if (nLen != nIndex) + { + pElement->m_oBrush.TexturePath.erase(nIndex + 1, nLen - nIndex); + } - if(oAtom.bSysIndex) - pElement->m_oBrush.Color1 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else - oAtom.ToColor(&pElement->m_oBrush.Color1); + pElement->m_oBrush.TexturePath = pElement->m_oBrush.TexturePath + pInfo->GetFileNamePicture(dwOffset); + if (pElement->m_oBrush.Type == c_BrushTypePattern) + { + int rgbColor1 = 0xFFFFFF; + int rgbColor2 = 0; - if (pElement->m_oBrush.Type == c_BrushTypeNotSet ) - pElement->m_oBrush.Type = c_BrushTypeSolid; - - }break; - case fillBackColor: - { - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); + if (pElement->m_oBrush.Color1.m_lSchemeIndex == -1) + { + rgbColor1 = pElement->m_oBrush.Color1.GetLONG_RGB(); + } + else + { + if ((pSlide) && (pSlide->m_arColorScheme.size() > 0)) + { + rgbColor1 = pSlide->m_arColorScheme[pElement->m_oBrush.Color1.m_lSchemeIndex].GetLONG_RGB(); + } + else if ((pTheme) && (pTheme->m_arColorScheme.size() > 0)) + { + rgbColor1 = pTheme->m_arColorScheme[pElement->m_oBrush.Color1.m_lSchemeIndex].GetLONG_RGB(); + } + } + if (pElement->m_oBrush.Color2.m_lSchemeIndex == -1) + { + rgbColor2 = pElement->m_oBrush.Color2.GetLONG_RGB(); + } + else + { + if ((pSlide) && (pSlide->m_arColorScheme.size() > 0)) + { + rgbColor2 = pSlide->m_arColorScheme[pElement->m_oBrush.Color2.m_lSchemeIndex].GetLONG_RGB(); + } + else if ((pTheme) && (pTheme->m_arColorScheme.size() > 0)) + { + rgbColor2 = pTheme->m_arColorScheme[pElement->m_oBrush.Color2.m_lSchemeIndex].GetLONG_RGB(); + } + } + ChangeBlack2ColorImage(pElement->m_oBrush.TexturePath, rgbColor2, rgbColor1); - if(oAtom.bSysIndex) - pElement->m_oBrush.Color2 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else - oAtom.ToColor(&pElement->m_oBrush.Color2); - - if (pElement->m_bIsBackground && pElement->m_oBrush.Type == c_BrushTypeNotSet ) - { - pElement->m_oBrush.Type = c_BrushTypeSolid; - } - }break; - case fillOpacity: - { - pElement->m_oBrush.Alpha1 = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255)); - }break; - case fillBackOpacity: - { - pElement->m_oBrush.Alpha2 = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255)); - }break; - case fillAngle: - { - pElement->m_oBrush.LinearAngle = FixedPointToDouble(pProperty->m_lValue); - }break; - case fillRectLeft: - { - pElement->m_oBrush.Rect.X = pProperty->m_lValue; - pElement->m_oBrush.Rectable = true; - }break; - case fillRectRight: - { - pElement->m_oBrush.Rect.Width = pProperty->m_lValue - pElement->m_oBrush.Rect.X; - pElement->m_oBrush.Rectable = true; - }break; - case fillRectTop: - { - pElement->m_oBrush.Rect.Y = pProperty->m_lValue; - pElement->m_oBrush.Rectable = true; - }break; - case fillRectBottom: - { - pElement->m_oBrush.Rect.Height = pProperty->m_lValue - pElement->m_oBrush.Rect.Y; - pElement->m_oBrush.Rectable = true; - }break; - case fillBackground: - { - }break; - case fillShadeType: - { - bool bShadeNone = GETBIT(pProperty->m_lValue, 31); - bool bShadeGamma = GETBIT(pProperty->m_lValue, 30); - bool bShadeSigma = GETBIT(pProperty->m_lValue, 29); - bool bShadeBand = GETBIT(pProperty->m_lValue, 28); - bool bShadeOneColor = GETBIT(pProperty->m_lValue, 27); + pElement->m_oBrush.Type = c_BrushTypeTexture; + pElement->m_oBrush.TextureMode = c_BrushTextureModeTile; + } + }break; + case fillColor: + { + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); - }break; - case fillFocus://relative position of the last color in the shaded fill - { - }break; - case fillShadePreset: - {//value (int) from 0x00000088 through 0x0000009F or complex - }break; - case fillShadeColors: - { - unsigned short nElems = pProperty->m_lValue/8; - _INT32* pCompl = (_INT32*)pProperty->m_pOptions; - - while(nElems--) - { - CColor color; - SColorAtom oAtom; - oAtom.FromValue(*pCompl); pCompl++; - oAtom.ToColor(&color); - - _UINT32 dwPosition = *pCompl; pCompl++; - pElement->m_oBrush.ColorsPosition.push_back(std::pair(color, 100. * FIXED_POINT_unsigned(dwPosition))); - } - }break; - case fillStyleBooleanProperties: - { - BYTE flag1 = (BYTE)(pProperty->m_lValue); - BYTE flag2 = (BYTE)(pProperty->m_lValue >> 16); + if(oAtom.bSysIndex) + pElement->m_oBrush.Color1 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else + oAtom.ToColor(&pElement->m_oBrush.Color1); - bool bNoFillHitTest = (0x01 == (0x01 & flag1)); - bool bFillUseRect = (0x02 == (0x02 & flag1)); - bool bFillShape = (0x04 == (0x04 & flag1)); - bool bHitTestFill = (0x08 == (0x08 & flag1)); - bool bFilled = (0x10 == (0x10 & flag1)); - bool bUseShapeAnchor = (0x20 == (0x20 & flag1)); - bool bRecolorFillAsPictures = (0x40 == (0x40 & flag1)); + if (pElement->m_oBrush.Type == c_BrushTypeNotSet ) + pElement->m_oBrush.Type = c_BrushTypeSolid; - bool bUsebNoFillHitTest = (0x01 == (0x01 & flag2)); - bool bUsebFillUseRect = (0x02 == (0x02 & flag2)); - bool bUsebFillShape = (0x04 == (0x04 & flag2)); - bool bUsebHitTestFill = (0x08 == (0x08 & flag2)); - bool bUsebFilled = (0x10 == (0x10 & flag2)); - bool bUsebUseShapeAnchor = (0x20 == (0x20 & flag2)); - bool bUsebRecolorFillAsPictures = (0x40 == (0x40 & flag2)); + }break; + case fillBackColor: + { + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); - if (bUsebFilled) - pElement->m_bIsFilled = bFilled; + if(oAtom.bSysIndex) + pElement->m_oBrush.Color2 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else + oAtom.ToColor(&pElement->m_oBrush.Color2); - break; - } - case ODRAW::geometryBooleanProperties: - { - BYTE flag1 = (BYTE)(pProperty->m_lValue); - BYTE flag2 = (BYTE)(pProperty->m_lValue >> 8); - BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); - BYTE flag4 = (BYTE)(pProperty->m_lValue >> 24); + if (pElement->m_bIsBackground && pElement->m_oBrush.Type == c_BrushTypeNotSet ) + { + pElement->m_oBrush.Type = c_BrushTypeSolid; + } + }break; + case fillOpacity: + { + pElement->m_oBrush.Alpha1 = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255)); + }break; + case fillBackOpacity: + { + pElement->m_oBrush.Alpha2 = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255)); + }break; + case fillAngle: + { + pElement->m_oBrush.LinearAngle = FixedPointToDouble(pProperty->m_lValue); + }break; + case fillRectLeft: + { + pElement->m_oBrush.Rect.X = pProperty->m_lValue; + pElement->m_oBrush.Rectable = true; + }break; + case fillRectRight: + { + pElement->m_oBrush.Rect.Width = pProperty->m_lValue - pElement->m_oBrush.Rect.X; + pElement->m_oBrush.Rectable = true; + }break; + case fillRectTop: + { + pElement->m_oBrush.Rect.Y = pProperty->m_lValue; + pElement->m_oBrush.Rectable = true; + }break; + case fillRectBottom: + { + pElement->m_oBrush.Rect.Height = pProperty->m_lValue - pElement->m_oBrush.Rect.Y; + pElement->m_oBrush.Rectable = true; + }break; + case fillBackground: + { + }break; + case fillShadeType: + { + bool bShadeNone = GETBIT(pProperty->m_lValue, 31); + bool bShadeGamma = GETBIT(pProperty->m_lValue, 30); + bool bShadeSigma = GETBIT(pProperty->m_lValue, 29); + bool bShadeBand = GETBIT(pProperty->m_lValue, 28); + bool bShadeOneColor = GETBIT(pProperty->m_lValue, 27); - bool bFillOk = (0x01 == (0x01 & flag1)); - bool bFillShadeShapeOk = (0x02 == (0x02 & flag1)); - bool bGTextOk = (0x04 == (0x04 & flag1)); - bool bLineOk = (0x08 == (0x08 & flag1)); - bool b3DOk = (0x10 == (0x10 & flag1)); - bool bShadowOk = (0x20 == (0x20 & flag1)); + }break; + case fillFocus://relative position of the last color in the shaded fill + { + }break; + case fillShadePreset: + {//value (int) from 0x00000088 through 0x0000009F or complex + }break; + case fillShadeColors: + { + unsigned short nElems = pProperty->m_lValue/8; + _INT32* pCompl = (_INT32*)pProperty->m_pOptions; - bool bUseFillOk = (0x01 == (0x01 & flag3)); - bool bUseFillShadeShapeOk = (0x02 == (0x02 & flag3)); - bool bUseGTextOk = (0x04 == (0x04 & flag3)); - bool bUseLineOk = (0x08 == (0x08 & flag3)); - bool bUse3DOk = (0x10 == (0x10 & flag3)); - bool bUseShadowOk = (0x20 == (0x20 & flag3)); + while(nElems--) + { + CColor color; + SColorAtom oAtom; + oAtom.FromValue(*pCompl); pCompl++; + oAtom.ToColor(&color); - //if (bUseLineOk) - // pElement->m_bLine = bLineOk;//?? todooo проверить - не сраюатывает ! 1 (82).ppt + _UINT32 dwPosition = *pCompl; pCompl++; + pElement->m_oBrush.ColorsPosition.push_back(std::pair(color, 100. * FIXED_POINT_unsigned(dwPosition))); + } + }break; + case fillStyleBooleanProperties: + { + BYTE flag1 = (BYTE)(pProperty->m_lValue); + BYTE flag2 = (BYTE)(pProperty->m_lValue >> 16); - if (bUseFillOk) - pElement->m_bIsFilled = bFillOk; + bool bNoFillHitTest = (0x01 == (0x01 & flag1)); + bool bFillUseRect = (0x02 == (0x02 & flag1)); + bool bFillShape = (0x04 == (0x04 & flag1)); + bool bHitTestFill = (0x08 == (0x08 & flag1)); + bool bFilled = (0x10 == (0x10 & flag1)); + bool bUseShapeAnchor = (0x20 == (0x20 & flag1)); + bool bRecolorFillAsPictures = (0x40 == (0x40 & flag1)); - break; - } -// line -------------------------------------------------------- - case lineStyleBooleanProperties: //Line Style Boolean Properties - { - bool bUsefLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 25); - bool bUsefInsetPen = GETBIT(pProperty->m_lValue, 22); - bool bUsefInsetPenOK = GETBIT(pProperty->m_lValue, 21); - bool bUsefArrowheadsOK = GETBIT(pProperty->m_lValue, 20); - bool bUsefLine = GETBIT(pProperty->m_lValue, 19); - bool bUsefHitTestLine = GETBIT(pProperty->m_lValue, 18); - bool bUsefLineFillShape = GETBIT(pProperty->m_lValue, 17); - bool bUsefNoLineDrawDash = GETBIT(pProperty->m_lValue, 16); + bool bUsebNoFillHitTest = (0x01 == (0x01 & flag2)); + bool bUsebFillUseRect = (0x02 == (0x02 & flag2)); + bool bUsebFillShape = (0x04 == (0x04 & flag2)); + bool bUsebHitTestFill = (0x08 == (0x08 & flag2)); + bool bUsebFilled = (0x10 == (0x10 & flag2)); + bool bUsebUseShapeAnchor = (0x20 == (0x20 & flag2)); + bool bUsebRecolorFillAsPictures = (0x40 == (0x40 & flag2)); - bool bLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 9); - bool bInsetPen = GETBIT(pProperty->m_lValue, 6); - bool bInsetPenOK = GETBIT(pProperty->m_lValue, 5); - bool bArrowheadsOK = GETBIT(pProperty->m_lValue, 4); - bool bLine = GETBIT(pProperty->m_lValue, 3); - bool bHitTestLine = GETBIT(pProperty->m_lValue, 2); - bool bLineFillShape = GETBIT(pProperty->m_lValue, 1); - bool bNoLineDrawDash = GETBIT(pProperty->m_lValue, 0); + if (bUsebFilled) + pElement->m_bIsFilled = bFilled; - if (bUsefLine) - pElement->m_bLine = bLine; - }break; - case lineDashStyle://from Complex - { - pElement->m_bLine = true; - }break; - case lineColor: - { - pElement->m_bLine = true; - - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); - - if (oAtom.bSysIndex) - pElement->m_oPen.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else - oAtom.ToColor(&pElement->m_oPen.Color); - }break; - case lineOpacity: - { - pElement->m_oPen.Alpha = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255)); - }break; - case lineBackColor: - { - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); - - if (oAtom.bSysIndex) - pElement->m_oPen.Color2 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else - oAtom.ToColor(&pElement->m_oPen.Color2); + break; + } + case ODRAW::geometryBooleanProperties: + { + BYTE flag1 = (BYTE)(pProperty->m_lValue); + BYTE flag2 = (BYTE)(pProperty->m_lValue >> 8); + BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); + BYTE flag4 = (BYTE)(pProperty->m_lValue >> 24); - }break; - case lineWidth: - { - pElement->m_oPen.Size = pProperty->m_lValue; - pElement->m_bLine = true; - }break; - case lineStyle: - { - pElement->m_bLine = true; - pElement->m_oPen.LineStyle = pProperty->m_lValue; - }break; - case lineDashing: - { - pElement->m_bLine = true; - pElement->m_oPen.DashStyle = pProperty->m_lValue; - }break; - case lineJoinStyle: - { - pElement->m_oPen.LineJoin = pProperty->m_lValue; - }break; - case lineStartArrowLength: - { - pElement->m_oPen.LineStartLength = pProperty->m_lValue; - }break; - case lineEndArrowLength: - { - pElement->m_oPen.LineEndLength = pProperty->m_lValue; - }break; - case lineStartArrowWidth: - { - pElement->m_oPen.LineStartWidth = pProperty->m_lValue; - }break; - case lineEndArrowWidth: - { - pElement->m_oPen.LineEndWidth = pProperty->m_lValue; - }break; - case lineStartArrowhead: - { - pElement->m_oPen.LineStartCap = pProperty->m_lValue; - }break; - case lineEndArrowhead: - { - pElement->m_oPen.LineEndCap = pProperty->m_lValue; - }break; - case shadowType: - { - pElement->m_oShadow.Type = pProperty->m_lValue; - }break; - case shadowOriginX://in emu, relative from center shape - { - pElement->m_oShadow.OriginX = FixedPointToDouble(pProperty->m_lValue); - }break; - case shadowOriginY: - { - pElement->m_oShadow.OriginY = FixedPointToDouble(pProperty->m_lValue); - }break; - case shadowColor: - { - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); + bool bFillOk = (0x01 == (0x01 & flag1)); + bool bFillShadeShapeOk = (0x02 == (0x02 & flag1)); + bool bGTextOk = (0x04 == (0x04 & flag1)); + bool bLineOk = (0x08 == (0x08 & flag1)); + bool b3DOk = (0x10 == (0x10 & flag1)); + bool bShadowOk = (0x20 == (0x20 & flag1)); - if (oAtom.bSysIndex) - pElement->m_oShadow.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else - oAtom.ToColor(&pElement->m_oShadow.Color); + bool bUseFillOk = (0x01 == (0x01 & flag3)); + bool bUseFillShadeShapeOk = (0x02 == (0x02 & flag3)); + bool bUseGTextOk = (0x04 == (0x04 & flag3)); + bool bUseLineOk = (0x08 == (0x08 & flag3)); + bool bUse3DOk = (0x10 == (0x10 & flag3)); + bool bUseShadowOk = (0x20 == (0x20 & flag3)); - }break; - case shadowWeight: - { - }break; - case shadowOpacity: - { + //if (bUseLineOk) + // pElement->m_bLine = bLineOk;//?? todooo проверить - не сраюатывает ! 1 (82).ppt + + if (bUseFillOk) + pElement->m_bIsFilled = bFillOk; + + break; + } + // line -------------------------------------------------------- + case lineStyleBooleanProperties: //Line Style Boolean Properties + { + bool bUsefLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 25); + bool bUsefInsetPen = GETBIT(pProperty->m_lValue, 22); + bool bUsefInsetPenOK = GETBIT(pProperty->m_lValue, 21); + bool bUsefArrowheadsOK = GETBIT(pProperty->m_lValue, 20); + bool bUsefLine = GETBIT(pProperty->m_lValue, 19); + bool bUsefHitTestLine = GETBIT(pProperty->m_lValue, 18); + bool bUsefLineFillShape = GETBIT(pProperty->m_lValue, 17); + bool bUsefNoLineDrawDash = GETBIT(pProperty->m_lValue, 16); + + bool bLineOpaqueBackColor = GETBIT(pProperty->m_lValue, 9); + bool bInsetPen = GETBIT(pProperty->m_lValue, 6); + bool bInsetPenOK = GETBIT(pProperty->m_lValue, 5); + bool bArrowheadsOK = GETBIT(pProperty->m_lValue, 4); + bool bLine = GETBIT(pProperty->m_lValue, 3); + bool bHitTestLine = GETBIT(pProperty->m_lValue, 2); + bool bLineFillShape = GETBIT(pProperty->m_lValue, 1); + bool bNoLineDrawDash = GETBIT(pProperty->m_lValue, 0); + + if (bUsefLine) + pElement->m_bLine = bLine; + }break; + case lineDashStyle://from Complex + { + pElement->m_bLine = true; + }break; + case lineColor: + { + pElement->m_bLine = true; + + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); + + if (oAtom.bSysIndex) + pElement->m_oPen.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else + oAtom.ToColor(&pElement->m_oPen.Color); + }break; + case lineOpacity: + { + pElement->m_oPen.Alpha = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255)); + }break; + case lineBackColor: + { + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); + + if (oAtom.bSysIndex) + pElement->m_oPen.Color2 = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else + oAtom.ToColor(&pElement->m_oPen.Color2); + + }break; + case lineWidth: + { + pElement->m_oPen.Size = pProperty->m_lValue; + pElement->m_bLine = true; + }break; + case lineStyle: + { + pElement->m_bLine = true; + pElement->m_oPen.LineStyle = pProperty->m_lValue; + }break; + case lineDashing: + { + pElement->m_bLine = true; + pElement->m_oPen.DashStyle = pProperty->m_lValue; + }break; + case lineJoinStyle: + { + pElement->m_oPen.LineJoin = pProperty->m_lValue; + }break; + case lineStartArrowLength: + { + pElement->m_oPen.LineStartLength = pProperty->m_lValue; + }break; + case lineEndArrowLength: + { + pElement->m_oPen.LineEndLength = pProperty->m_lValue; + }break; + case lineStartArrowWidth: + { + pElement->m_oPen.LineStartWidth = pProperty->m_lValue; + }break; + case lineEndArrowWidth: + { + pElement->m_oPen.LineEndWidth = pProperty->m_lValue; + }break; + case lineStartArrowhead: + { + pElement->m_oPen.LineStartCap = pProperty->m_lValue; + }break; + case lineEndArrowhead: + { + pElement->m_oPen.LineEndCap = pProperty->m_lValue; + }break; + case shadowType: + { + pElement->m_oShadow.Type = pProperty->m_lValue; + }break; + case shadowOriginX://in emu, relative from center shape + { + pElement->m_oShadow.OriginX = FixedPointToDouble(pProperty->m_lValue); + }break; + case shadowOriginY: + { + pElement->m_oShadow.OriginY = FixedPointToDouble(pProperty->m_lValue); + }break; + case shadowColor: + { + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); + + if (oAtom.bSysIndex) + pElement->m_oShadow.Color = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else + oAtom.ToColor(&pElement->m_oShadow.Color); + + }break; + case shadowWeight: + { + }break; + case shadowOpacity: + { pElement->m_oShadow.Alpha = (BYTE)(std::min)(255, (int)CDirectory::NormFixedPoint(pProperty->m_lValue, 255)); - }break; - case shadowHighlight: - { - //оттенок двойной тени - }break; - case shadowOffsetX: - {//signed - pElement->m_oShadow.DistanceX = (_INT32)pProperty->m_lValue; - }break; - case shadowOffsetY: - {//signed - pElement->m_oShadow.DistanceY = (_INT32)pProperty->m_lValue; - }break; - case shadowScaleXToX: - { - pElement->m_oShadow.ScaleXToX = FixedPointToDouble(pProperty->m_lValue); - }break; - case shadowScaleYToX: - { - pElement->m_oShadow.ScaleYToX = FixedPointToDouble(pProperty->m_lValue); - }break; - case shadowScaleXToY: - { - pElement->m_oShadow.ScaleXToY = FixedPointToDouble(pProperty->m_lValue); - }break; - case shadowScaleYToY: - { - pElement->m_oShadow.ScaleYToY = FixedPointToDouble(pProperty->m_lValue); - }break; - case shadowPerspectiveX: - { - pElement->m_oShadow.PerspectiveX = pProperty->m_lValue; - }break; - case shadowPerspectiveY: - { - pElement->m_oShadow.PerspectiveY = pProperty->m_lValue; - }break; - case shadowStyleBooleanProperties: - { - bool fshadowObscured = GETBIT(pProperty->m_lValue, 0); - bool fShadow = GETBIT(pProperty->m_lValue, 1); - bool fUsefshadowObscured = GETBIT(pProperty->m_lValue, 16); - bool fUsefShadow = GETBIT(pProperty->m_lValue, 17); + }break; + case shadowHighlight: + { + //оттенок двойной тени + }break; + case shadowOffsetX: + {//signed + pElement->m_oShadow.DistanceX = (_INT32)pProperty->m_lValue; + }break; + case shadowOffsetY: + {//signed + pElement->m_oShadow.DistanceY = (_INT32)pProperty->m_lValue; + }break; + case shadowScaleXToX: + { + pElement->m_oShadow.ScaleXToX = FixedPointToDouble(pProperty->m_lValue); + }break; + case shadowScaleYToX: + { + pElement->m_oShadow.ScaleYToX = FixedPointToDouble(pProperty->m_lValue); + }break; + case shadowScaleXToY: + { + pElement->m_oShadow.ScaleXToY = FixedPointToDouble(pProperty->m_lValue); + }break; + case shadowScaleYToY: + { + pElement->m_oShadow.ScaleYToY = FixedPointToDouble(pProperty->m_lValue); + }break; + case shadowPerspectiveX: + { + pElement->m_oShadow.PerspectiveX = pProperty->m_lValue; + }break; + case shadowPerspectiveY: + { + pElement->m_oShadow.PerspectiveY = pProperty->m_lValue; + }break; + case shadowStyleBooleanProperties: + { + bool fshadowObscured = GETBIT(pProperty->m_lValue, 0); + bool fShadow = GETBIT(pProperty->m_lValue, 1); + bool fUsefshadowObscured = GETBIT(pProperty->m_lValue, 16); + bool fUsefShadow = GETBIT(pProperty->m_lValue, 17); - if (fUsefShadow) - pElement->m_oShadow.Visible = fShadow; - - if (!fUsefShadow && fUsefshadowObscured) - { - //контурная - pElement->m_oShadow.Visible = fshadowObscured; - } - }break; - case shapeBoolean: - { - bool fUsefPolicyLabel = GETBIT(pProperty->m_lValue, 25); - bool fUsefPolicyBarcode = GETBIT(pProperty->m_lValue, 24); - bool fUsefFlipHOverride = GETBIT(pProperty->m_lValue, 23); - bool fUsefFlipVOverride = GETBIT(pProperty->m_lValue, 22); - bool fUsefOleIcon = GETBIT(pProperty->m_lValue, 21); - bool fUsefPreferRelativeResize = GETBIT(pProperty->m_lValue, 20); - bool fUsefLockShapeType = GETBIT(pProperty->m_lValue, 19); - bool fUsefInitiator = GETBIT(pProperty->m_lValue, 18); - bool fUsefBackground = GETBIT(pProperty->m_lValue, 16); - - bool fPolicyLabel = fUsefPolicyLabel ? GETBIT(pProperty->m_lValue, 9) : false; - bool fPolicyBarcode = fUsefPolicyBarcode ? GETBIT(pProperty->m_lValue, 8) : false; - bool fFlipHOverride = fUsefFlipHOverride ? GETBIT(pProperty->m_lValue, 7) : false; - bool fFlipVOverride = fUsefFlipVOverride ? GETBIT(pProperty->m_lValue, 6) : false; - bool fOleIcon = fUsefOleIcon ? GETBIT(pProperty->m_lValue, 5) : false; - bool fPreferRelativeResize = fUsefPreferRelativeResize ? GETBIT(pProperty->m_lValue, 4) : false; - bool fLockShapeType = fUsefLockShapeType ? GETBIT(pProperty->m_lValue, 3) : false; - bool fInitiator = fUsefInitiator ? GETBIT(pProperty->m_lValue, 2) : false; - bool fBackground = fUsefBackground ? GETBIT(pProperty->m_lValue, 0) : false; - }break; - case groupShapeBooleanProperties: - { - bool fUsefLayoutInCell = GETBIT(pProperty->m_lValue, 31); - bool fUsefIsBullet = GETBIT(pProperty->m_lValue, 30); - bool fUsefStandardHR = GETBIT(pProperty->m_lValue, 29); - bool fUsefNoshadeHR = GETBIT(pProperty->m_lValue, 28); - bool fUsefHorizRule = GETBIT(pProperty->m_lValue, 27); - bool fUsefUserDrawn = GETBIT(pProperty->m_lValue, 26); - bool fUsefAllowOverlap = GETBIT(pProperty->m_lValue, 25); - bool fUsefReallyHidden = GETBIT(pProperty->m_lValue, 24); - bool fUsefScriptAnchor = GETBIT(pProperty->m_lValue, 23); - bool fUsefEditedWrap = GETBIT(pProperty->m_lValue, 22); - bool fUsefBehindDocument = GETBIT(pProperty->m_lValue, 21); - bool fUsefOnDblClickNotify = GETBIT(pProperty->m_lValue, 20); - bool fUsefIsButton = GETBIT(pProperty->m_lValue, 19); - bool fUsefOneD = GETBIT(pProperty->m_lValue, 18); - bool fUsefHidden = GETBIT(pProperty->m_lValue, 17); - bool fUsefPrint = GETBIT(pProperty->m_lValue, 16); - - bool fLayoutInCell = fUsefLayoutInCell ? GETBIT(pProperty->m_lValue, 15) : true; - bool fIsBullet = fUsefIsBullet ? GETBIT(pProperty->m_lValue, 14) : false; - bool fStandardHR = fUsefStandardHR ? GETBIT(pProperty->m_lValue, 13) : false; - bool fNoshadeHR = fUsefNoshadeHR ? GETBIT(pProperty->m_lValue, 12) : false; - bool fHorizRule = fUsefHorizRule ? GETBIT(pProperty->m_lValue, 11) : false; - bool fUserDrawn = fUsefUserDrawn ? GETBIT(pProperty->m_lValue, 10) : false; - bool fAllowOverlap = fUsefAllowOverlap ? GETBIT(pProperty->m_lValue, 9) : true; - bool fReallyHidden = fUsefReallyHidden ? GETBIT(pProperty->m_lValue, 8) : false; - bool fScriptAnchor = fUsefScriptAnchor ? GETBIT(pProperty->m_lValue, 7) : false; - bool fEditedWrap = fUsefEditedWrap ? GETBIT(pProperty->m_lValue, 6) : false; - bool fBehindDocument = fUsefBehindDocument ? GETBIT(pProperty->m_lValue, 5) : false; - bool fOnDblClickNotify = fUsefOnDblClickNotify ? GETBIT(pProperty->m_lValue, 4) : false; - bool fIsButton = fUsefIsButton ? GETBIT(pProperty->m_lValue, 3) : false; - bool fOneD = fUsefOneD ? GETBIT(pProperty->m_lValue, 2) : false; - bool fHidden = fUsefHidden ? GETBIT(pProperty->m_lValue, 1) : false; - bool fPrint = fUsefPrint ? GETBIT(pProperty->m_lValue, 0) : true; + if (fUsefShadow) + pElement->m_oShadow.Visible = fShadow; - pElement->m_bHidden = fHidden || fIsBullet; - //presentation_ticio_20100610.ppt - }break; - default: - break; - } + if (!fUsefShadow && fUsefshadowObscured) + { + //контурная + pElement->m_oShadow.Visible = fshadowObscured; + } + }break; + case shapeBoolean: + { + bool fUsefPolicyLabel = GETBIT(pProperty->m_lValue, 25); + bool fUsefPolicyBarcode = GETBIT(pProperty->m_lValue, 24); + bool fUsefFlipHOverride = GETBIT(pProperty->m_lValue, 23); + bool fUsefFlipVOverride = GETBIT(pProperty->m_lValue, 22); + bool fUsefOleIcon = GETBIT(pProperty->m_lValue, 21); + bool fUsefPreferRelativeResize = GETBIT(pProperty->m_lValue, 20); + bool fUsefLockShapeType = GETBIT(pProperty->m_lValue, 19); + bool fUsefInitiator = GETBIT(pProperty->m_lValue, 18); + bool fUsefBackground = GETBIT(pProperty->m_lValue, 16); + + bool fPolicyLabel = fUsefPolicyLabel ? GETBIT(pProperty->m_lValue, 9) : false; + bool fPolicyBarcode = fUsefPolicyBarcode ? GETBIT(pProperty->m_lValue, 8) : false; + bool fFlipHOverride = fUsefFlipHOverride ? GETBIT(pProperty->m_lValue, 7) : false; + bool fFlipVOverride = fUsefFlipVOverride ? GETBIT(pProperty->m_lValue, 6) : false; + bool fOleIcon = fUsefOleIcon ? GETBIT(pProperty->m_lValue, 5) : false; + bool fPreferRelativeResize = fUsefPreferRelativeResize ? GETBIT(pProperty->m_lValue, 4) : false; + bool fLockShapeType = fUsefLockShapeType ? GETBIT(pProperty->m_lValue, 3) : false; + bool fInitiator = fUsefInitiator ? GETBIT(pProperty->m_lValue, 2) : false; + bool fBackground = fUsefBackground ? GETBIT(pProperty->m_lValue, 0) : false; + }break; + case groupShapeBooleanProperties: + { + bool fUsefLayoutInCell = GETBIT(pProperty->m_lValue, 31); + bool fUsefIsBullet = GETBIT(pProperty->m_lValue, 30); + bool fUsefStandardHR = GETBIT(pProperty->m_lValue, 29); + bool fUsefNoshadeHR = GETBIT(pProperty->m_lValue, 28); + bool fUsefHorizRule = GETBIT(pProperty->m_lValue, 27); + bool fUsefUserDrawn = GETBIT(pProperty->m_lValue, 26); + bool fUsefAllowOverlap = GETBIT(pProperty->m_lValue, 25); + bool fUsefReallyHidden = GETBIT(pProperty->m_lValue, 24); + bool fUsefScriptAnchor = GETBIT(pProperty->m_lValue, 23); + bool fUsefEditedWrap = GETBIT(pProperty->m_lValue, 22); + bool fUsefBehindDocument = GETBIT(pProperty->m_lValue, 21); + bool fUsefOnDblClickNotify = GETBIT(pProperty->m_lValue, 20); + bool fUsefIsButton = GETBIT(pProperty->m_lValue, 19); + bool fUsefOneD = GETBIT(pProperty->m_lValue, 18); + bool fUsefHidden = GETBIT(pProperty->m_lValue, 17); + bool fUsefPrint = GETBIT(pProperty->m_lValue, 16); + + bool fLayoutInCell = fUsefLayoutInCell ? GETBIT(pProperty->m_lValue, 15) : true; + bool fIsBullet = fUsefIsBullet ? GETBIT(pProperty->m_lValue, 14) : false; + bool fStandardHR = fUsefStandardHR ? GETBIT(pProperty->m_lValue, 13) : false; + bool fNoshadeHR = fUsefNoshadeHR ? GETBIT(pProperty->m_lValue, 12) : false; + bool fHorizRule = fUsefHorizRule ? GETBIT(pProperty->m_lValue, 11) : false; + bool fUserDrawn = fUsefUserDrawn ? GETBIT(pProperty->m_lValue, 10) : false; + bool fAllowOverlap = fUsefAllowOverlap ? GETBIT(pProperty->m_lValue, 9) : true; + bool fReallyHidden = fUsefReallyHidden ? GETBIT(pProperty->m_lValue, 8) : false; + bool fScriptAnchor = fUsefScriptAnchor ? GETBIT(pProperty->m_lValue, 7) : false; + bool fEditedWrap = fUsefEditedWrap ? GETBIT(pProperty->m_lValue, 6) : false; + bool fBehindDocument = fUsefBehindDocument ? GETBIT(pProperty->m_lValue, 5) : false; + bool fOnDblClickNotify = fUsefOnDblClickNotify ? GETBIT(pProperty->m_lValue, 4) : false; + bool fIsButton = fUsefIsButton ? GETBIT(pProperty->m_lValue, 3) : false; + bool fOneD = fUsefOneD ? GETBIT(pProperty->m_lValue, 2) : false; + bool fHidden = fUsefHidden ? GETBIT(pProperty->m_lValue, 1) : false; + bool fPrint = fUsefPrint ? GETBIT(pProperty->m_lValue, 0) : true; + + pElement->m_bHidden = fHidden || fIsBullet; + //presentation_ticio_20100610.ppt + }break; + case tableProperties: + case tableRowProperties: + { + pElement->m_etType = etTable; + break; + } + default: + break; + } } void CPPTElement::SetUpPropertyVideo(CElementPtr pElement, CTheme* pTheme, CSlideInfo* pInfo, CSlide* pSlide, CProperty* pProperty) { - SetUpPropertyImage(pElement, pTheme, pInfo, pSlide, pProperty); + SetUpPropertyImage(pElement, pTheme, pInfo, pSlide, pProperty); } void CPPTElement::SetUpPropertyAudio(CElementPtr pElement, CTheme* pTheme, CSlideInfo* pInfo, CSlide* pSlide, CProperty* pProperty) { - SetUpPropertyImage(pElement, pTheme, pInfo, pSlide, pProperty); + SetUpPropertyImage(pElement, pTheme, pInfo, pSlide, pProperty); } void CPPTElement::SetUpPropertyImage(CElementPtr pElement, CTheme* pTheme, CSlideInfo* pInfo, CSlide* pSlide, CProperty* pProperty) { - SetUpProperty(pElement, pTheme, pInfo, pSlide, pProperty); + SetUpProperty(pElement, pTheme, pInfo, pSlide, pProperty); - CImageElement* image_element = dynamic_cast(pElement.get()); + CImageElement* image_element = dynamic_cast(pElement.get()); - switch(pProperty->m_ePID) - { - case pib: - { - int dwOffset = pInfo->GetIndexPicture(pProperty->m_lValue); - if (dwOffset >=0) - { - image_element->m_strImageFileName += pInfo->GetFileNamePicture(dwOffset); - image_element->m_bImagePresent = true; - } - }break; - case pictureId://OLE identifier of the picture. - { - image_element->m_bOLE = true; - }break; - case pibName: - { - image_element->m_sImageName = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue /2-1); - // TextMining05.ppt, слайд 20 - некорректное имя ( - todooo потом подчистить его - }break; - case cropFromTop: - { - image_element->m_lcropFromTop = (_INT32)pProperty->m_lValue; - image_element->m_bCropEnabled = true; - }break; - case cropFromBottom: - { - image_element->m_lcropFromBottom = (_INT32)pProperty->m_lValue; - image_element->m_bCropEnabled = true; - }break; - case cropFromLeft: - { - image_element->m_lcropFromLeft = (_INT32)pProperty->m_lValue; - image_element->m_bCropEnabled = true; - }break; - case cropFromRight: - { - image_element->m_lcropFromRight = (_INT32)pProperty->m_lValue; - image_element->m_bCropEnabled = true; - }break; - case pibFlags: - { - }break; - } + switch(pProperty->m_ePID) + { + case pib: + { + int dwOffset = pInfo->GetIndexPicture(pProperty->m_lValue); + if (dwOffset >=0) + { + image_element->m_strImageFileName += pInfo->GetFileNamePicture(dwOffset); + image_element->m_bImagePresent = true; + } + }break; + case pictureId://OLE identifier of the picture. + { + image_element->m_bOLE = true; + }break; + case pibName: + { + image_element->m_sImageName = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue /2-1); + // TextMining05.ppt, слайд 20 - некорректное имя ( - todooo потом подчистить его + }break; + case cropFromTop: + { + image_element->m_lcropFromTop = (_INT32)pProperty->m_lValue; + image_element->m_bCropEnabled = true; + }break; + case cropFromBottom: + { + image_element->m_lcropFromBottom = (_INT32)pProperty->m_lValue; + image_element->m_bCropEnabled = true; + }break; + case cropFromLeft: + { + image_element->m_lcropFromLeft = (_INT32)pProperty->m_lValue; + image_element->m_bCropEnabled = true; + }break; + case cropFromRight: + { + image_element->m_lcropFromRight = (_INT32)pProperty->m_lValue; + image_element->m_bCropEnabled = true; + }break; + case pibFlags: + { + }break; + } } void CPPTElement::SetUpPropertyShape(CElementPtr pElement, CTheme* pTheme, CSlideInfo* pInfo, CSlide* pSlide, CProperty* pProperty) { - SetUpProperty(pElement, pTheme, pInfo, pSlide, pProperty); + SetUpProperty(pElement, pTheme, pInfo, pSlide, pProperty); - CShapeElement* shape_element = dynamic_cast(pElement.get()); + CShapeElement* shape_element = dynamic_cast(pElement.get()); - CShapePtr pParentShape = shape_element->m_pShape; - if (NULL == pParentShape) - return; + CShapePtr pParentShape = shape_element->m_pShape; + if (NULL == pParentShape) + return; - CPPTShape* pShape = dynamic_cast(pParentShape->getBaseShape().get()); + CPPTShape* pShape = dynamic_cast(pParentShape->getBaseShape().get()); - if (NULL == pShape) - return; + if (NULL == pShape) + return; - switch (pProperty->m_ePID) - { - case ODRAW::metroBlob: - { - NSFile::CFileBinary file; + switch (pProperty->m_ePID) + { + case ODRAW::metroBlob: + { + NSFile::CFileBinary file; std::wstring temp = NSDirectory::GetTempPath(); - std::wstring tempFileName = temp + FILE_SEPARATOR_STR + L"tempMetroBlob.zip"; + std::wstring tempFileName = temp + FILE_SEPARATOR_STR + L"tempMetroBlob.zip"; - if (file.CreateFileW(tempFileName)) - { - file.WriteFile(pProperty->m_pOptions, pProperty->m_lValue); - file.CloseFile(); - } - COfficeUtils officeUtils(NULL); + if (file.CreateFileW(tempFileName)) + { + file.WriteFile(pProperty->m_pOptions, pProperty->m_lValue); + file.CloseFile(); + } + COfficeUtils officeUtils(NULL); - BYTE *utf8Data = NULL; - ULONG utf8DataSize = 0; - if (S_OK != officeUtils.LoadFileFromArchive(tempFileName, L"drs/shapexml.xml", &utf8Data, utf8DataSize)) - { - officeUtils.LoadFileFromArchive(tempFileName, L"drs/diagrams/drawing1.xml", &utf8Data, utf8DataSize); - } + BYTE *utf8Data = NULL; + ULONG utf8DataSize = 0; + if (S_OK != officeUtils.LoadFileFromArchive(tempFileName, L"drs/shapexml.xml", &utf8Data, utf8DataSize)) + { + officeUtils.LoadFileFromArchive(tempFileName, L"drs/diagrams/drawing1.xml", &utf8Data, utf8DataSize); + } - if (utf8Data && utf8DataSize > 0) - { - pParentShape->m_strXmlString = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8(utf8Data, utf8DataSize); + if (utf8Data && utf8DataSize > 0) + { + pParentShape->m_strXmlString = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8(utf8Data, utf8DataSize); - delete []utf8Data; - } - NSFile::CFileBinary::Remove(tempFileName); - }break; - case ODRAW::geoRight: - { - if (0 < pProperty->m_lValue) - pParentShape->m_dWidthLogic = (double)(pProperty->m_lValue); - }break; - case ODRAW::geoBottom: - { - if (0 < pProperty->m_lValue) - pParentShape->m_dHeightLogic = (double)(pProperty->m_lValue); - }break; - case ODRAW::shapePath: - { - pShape->m_oCustomVML.SetPath((RulesType)pProperty->m_lValue); - pShape->m_bCustomShape = true; - }break; - case ODRAW::pSegmentInfo: - { - if (pProperty->m_bComplex) - { - pShape->m_oCustomVML.LoadSegments(pProperty); - pShape->m_bCustomShape = true; - } - }break; - case ODRAW::pVertices: - { - if (pProperty->m_bComplex) - { - pShape->m_oCustomVML.LoadVertices(pProperty); - pShape->m_bCustomShape = true; - } - }break; - case ODRAW::pConnectionSites: - { - if (pProperty->m_bComplex) - { - pShape->m_oCustomVML.LoadConnectionSites(pProperty); - } - }break; - case ODRAW::pConnectionSitesDir: - { - if (pProperty->m_bComplex) - { - pShape->m_oCustomVML.LoadConnectionSitesDir(pProperty); - } - }break; - case ODRAW::pGuides: - { - if (pProperty->m_bComplex/* && pShape->m_eType != sptNotchedCircularArrow*/) - {//Тікбұрышты үшбұрыштарды.ppt - slide 25 - pShape->m_oCustomVML.LoadGuides(pProperty); - } - }break; - case ODRAW::pInscribe: - { - if (pProperty->m_bComplex) - { - pShape->m_oCustomVML.LoadInscribe(pProperty); - } - }break; - case ODRAW::pAdjustHandles: - { - if (pProperty->m_bComplex) - { - pShape->m_oCustomVML.LoadAHs(pProperty); - } - }break; - case ODRAW::adjustValue: - case ODRAW::adjust2Value: - case ODRAW::adjust3Value: - case ODRAW::adjust4Value: - case ODRAW::adjust5Value: - case ODRAW::adjust6Value: - case ODRAW::adjust7Value: - case ODRAW::adjust8Value: - case ODRAW::adjust9Value: - case ODRAW::adjust10Value: - { - LONG lIndexAdj = pProperty->m_ePID - ODRAW::adjustValue; - if (lIndexAdj >= 0 && lIndexAdj < (LONG)pShape->m_arAdjustments.size()) - { - pShape->m_oCustomVML.LoadAdjusts(lIndexAdj, (LONG)pProperty->m_lValue); - } - else - { - pShape->m_oCustomVML.LoadAdjusts(lIndexAdj, (LONG)pProperty->m_lValue); - } - }break; -//-------------------------------------------------------------------------------------------------------------------- - case lTxid: - { - }break; - case ODRAW::dxTextLeft: - { - pParentShape->m_dTextMarginX = pProperty->m_lValue; - }break; - case ODRAW::dxTextRight: - { - pParentShape->m_dTextMarginRight = pProperty->m_lValue; - }break; - case ODRAW::dyTextTop: - { - pParentShape->m_dTextMarginY = pProperty->m_lValue; - }break; - case ODRAW::dyTextBottom: - { - pParentShape->m_dTextMarginBottom = pProperty->m_lValue; - }break; - case ODRAW::WrapText: - { - pParentShape->m_oText.m_lWrapMode = (LONG)pProperty->m_lValue; - }break; - case ODRAW::gtextUNICODE://word art text - { - if (pProperty->m_bComplex && 0 < pProperty->m_lValue) - { - std::wstring str = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue/2-1); + delete []utf8Data; + } + NSFile::CFileBinary::Remove(tempFileName); + }break; + case ODRAW::geoRight: + { + if (0 < pProperty->m_lValue) + pParentShape->m_dWidthLogic = (double)(pProperty->m_lValue); + }break; + case ODRAW::geoBottom: + { + if (0 < pProperty->m_lValue) + pParentShape->m_dHeightLogic = (double)(pProperty->m_lValue); + }break; + case ODRAW::shapePath: + { + pShape->m_oCustomVML.SetPath((RulesType)pProperty->m_lValue); + pShape->m_bCustomShape = true; + }break; + case ODRAW::pSegmentInfo: + { + if (pProperty->m_bComplex) + { + pShape->m_oCustomVML.LoadSegments(pProperty); + pShape->m_bCustomShape = true; + } + }break; + case ODRAW::pVertices: + { + if (pProperty->m_bComplex) + { + pShape->m_oCustomVML.LoadVertices(pProperty); + pShape->m_bCustomShape = true; + } + }break; + case ODRAW::pConnectionSites: + { + if (pProperty->m_bComplex) + { + pShape->m_oCustomVML.LoadConnectionSites(pProperty); + } + }break; + case ODRAW::pConnectionSitesDir: + { + if (pProperty->m_bComplex) + { + pShape->m_oCustomVML.LoadConnectionSitesDir(pProperty); + } + }break; + case ODRAW::pGuides: + { + if (pProperty->m_bComplex/* && pShape->m_eType != sptNotchedCircularArrow*/) + {//Тікбұрышты үшбұрыштарды.ppt - slide 25 + pShape->m_oCustomVML.LoadGuides(pProperty); + } + }break; + case ODRAW::pInscribe: + { + if (pProperty->m_bComplex) + { + pShape->m_oCustomVML.LoadInscribe(pProperty); + } + }break; + case ODRAW::pAdjustHandles: + { + if (pProperty->m_bComplex) + { + pShape->m_oCustomVML.LoadAHs(pProperty); + } + }break; + case ODRAW::adjustValue: + case ODRAW::adjust2Value: + case ODRAW::adjust3Value: + case ODRAW::adjust4Value: + case ODRAW::adjust5Value: + case ODRAW::adjust6Value: + case ODRAW::adjust7Value: + case ODRAW::adjust8Value: + case ODRAW::adjust9Value: + case ODRAW::adjust10Value: + { + LONG lIndexAdj = pProperty->m_ePID - ODRAW::adjustValue; + if (lIndexAdj >= 0 && lIndexAdj < (LONG)pShape->m_arAdjustments.size()) + { + pShape->m_oCustomVML.LoadAdjusts(lIndexAdj, (LONG)pProperty->m_lValue); + } + else + { + pShape->m_oCustomVML.LoadAdjusts(lIndexAdj, (LONG)pProperty->m_lValue); + } + }break; + //-------------------------------------------------------------------------------------------------------------------- + case lTxid: + { + }break; + case ODRAW::dxTextLeft: + { + pParentShape->m_dTextMarginX = pProperty->m_lValue; + }break; + case ODRAW::dxTextRight: + { + pParentShape->m_dTextMarginRight = pProperty->m_lValue; + }break; + case ODRAW::dyTextTop: + { + pParentShape->m_dTextMarginY = pProperty->m_lValue; + }break; + case ODRAW::dyTextBottom: + { + pParentShape->m_dTextMarginBottom = pProperty->m_lValue; + }break; + case ODRAW::WrapText: + { + pParentShape->m_oText.m_lWrapMode = (LONG)pProperty->m_lValue; + }break; + case ODRAW::gtextUNICODE://word art text + { + if (pProperty->m_bComplex && 0 < pProperty->m_lValue) + { + std::wstring str = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue/2-1); - if (!str.empty() && pParentShape->m_oText.m_arParagraphs.empty()) - { - int length = str.length(); + if (!str.empty() && pParentShape->m_oText.m_arParagraphs.empty()) + { + int length = str.length(); - for (int i = length-1; i>=0; i--) - { - if (str.at(i) > 13 ) break; - length--; - } - PPT_FORMAT::CParagraph p; - PPT_FORMAT::CSpan s; - s.m_strText = str.substr(0,length); - p.m_arSpans.push_back(s); - pParentShape->m_oText.m_arParagraphs.push_back(p); - } - } - }break; - case ODRAW::gtextFont: - { - if (pProperty->m_bComplex && 0 < pProperty->m_lValue) - { - std::wstring str = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue/2-1); - pParentShape->m_oText.m_oAttributes.m_oFont.Name = str; - } - }break; - case ODRAW::gtextSize: - { - pParentShape->m_oText.m_oAttributes.m_oFont.Size = (INT)((pProperty->m_lValue >> 16) & 0x0000FFFF); - break; - } - case ODRAW::anchorText: - { - switch (pProperty->m_lValue) - { - case ODRAW::anchorTop: - case ODRAW::anchorTopBaseline: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 0; - break; - } - case ODRAW::anchorMiddle: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 1; - break; - } - case ODRAW::anchorBottom: - case ODRAW::anchorBottomBaseline: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 0; - pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 2; - break; - } - case ODRAW::anchorTopCentered: - case ODRAW::anchorTopCenteredBaseline: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; - pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 0; - break; - } - case ODRAW::anchorMiddleCentered: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; - pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 1; - break; - } - case ODRAW::anchorBottomCentered: - case ODRAW::anchorBottomCenteredBaseline: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; - pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 2; - break; - } - default: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; - pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = -1; // not set - break; - } - }; - break; - } - case ODRAW::gtextAlign: - { - switch (pProperty->m_lValue) - { - case ODRAW::alignTextLeft: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 0; - }break; - case ODRAW::alignTextCenter: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; - }break; - case ODRAW::alignTextRight: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 2; - }break; - default: - { - pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; - }break; - }; - break; - } - case ODRAW::geometryTextBooleanProperties: - { - // вот здесь - нужно единицы перевести в пикселы - BYTE flag1 = (BYTE)(pProperty->m_lValue); - BYTE flag2 = (BYTE)(pProperty->m_lValue >> 8); - BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); - BYTE flag4 = (BYTE)(pProperty->m_lValue >> 24); + for (int i = length-1; i>=0; i--) + { + if (str.at(i) > 13 ) break; + length--; + } + PPT_FORMAT::CParagraph p; + PPT_FORMAT::CSpan s; + s.m_strText = str.substr(0,length); + p.m_arSpans.push_back(s); + pParentShape->m_oText.m_arParagraphs.push_back(p); + } + } + }break; + case ODRAW::gtextFont: + { + if (pProperty->m_bComplex && 0 < pProperty->m_lValue) + { + std::wstring str = NSFile::CUtf8Converter::GetWStringFromUTF16((unsigned short*)pProperty->m_pOptions, pProperty->m_lValue/2-1); + pParentShape->m_oText.m_oAttributes.m_oFont.Name = str; + } + }break; + case ODRAW::gtextSize: + { + pParentShape->m_oText.m_oAttributes.m_oFont.Size = (INT)((pProperty->m_lValue >> 16) & 0x0000FFFF); + break; + } + case ODRAW::anchorText: + { + switch (pProperty->m_lValue) + { + case ODRAW::anchorTop: + case ODRAW::anchorTopBaseline: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 0; + break; + } + case ODRAW::anchorMiddle: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 1; + break; + } + case ODRAW::anchorBottom: + case ODRAW::anchorBottomBaseline: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 0; + pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 2; + break; + } + case ODRAW::anchorTopCentered: + case ODRAW::anchorTopCenteredBaseline: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; + pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 0; + break; + } + case ODRAW::anchorMiddleCentered: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; + pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 1; + break; + } + case ODRAW::anchorBottomCentered: + case ODRAW::anchorBottomCenteredBaseline: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; + pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = 2; + break; + } + default: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; + pParentShape->m_oText.m_oAttributes.m_nTextAlignVertical = -1; // not set + break; + } + }; + break; + } + case ODRAW::gtextAlign: + { + switch (pProperty->m_lValue) + { + case ODRAW::alignTextLeft: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 0; + }break; + case ODRAW::alignTextCenter: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; + }break; + case ODRAW::alignTextRight: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 2; + }break; + default: + { + pParentShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; + }break; + }; + break; + } + case ODRAW::geometryTextBooleanProperties: + { + // вот здесь - нужно единицы перевести в пикселы + BYTE flag1 = (BYTE)(pProperty->m_lValue); + BYTE flag2 = (BYTE)(pProperty->m_lValue >> 8); + BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); + BYTE flag4 = (BYTE)(pProperty->m_lValue >> 24); - bool bStrikethrought = (0x01 == (0x01 & flag1)); - bool bSmallCaps = (0x02 == (0x02 & flag1)); - bool bShadow = (0x04 == (0x04 & flag1)); - bool bUnderline = (0x08 == (0x08 & flag1)); - bool bItalic = (0x10 == (0x10 & flag1)); - bool bBold = (0x20 == (0x20 & flag1)); + bool bStrikethrought = (0x01 == (0x01 & flag1)); + bool bSmallCaps = (0x02 == (0x02 & flag1)); + bool bShadow = (0x04 == (0x04 & flag1)); + bool bUnderline = (0x08 == (0x08 & flag1)); + bool bItalic = (0x10 == (0x10 & flag1)); + bool bBold = (0x20 == (0x20 & flag1)); - bool bUseStrikethrought = (0x01 == (0x01 & flag3)); - bool bUseSmallCaps = (0x02 == (0x02 & flag3)); - bool bUseShadow = (0x04 == (0x04 & flag3)); - bool bUseUnderline = (0x08 == (0x08 & flag3)); - bool bUseItalic = (0x10 == (0x10 & flag3)); - bool bUseBold = (0x20 == (0x20 & flag3)); + bool bUseStrikethrought = (0x01 == (0x01 & flag3)); + bool bUseSmallCaps = (0x02 == (0x02 & flag3)); + bool bUseShadow = (0x04 == (0x04 & flag3)); + bool bUseUnderline = (0x08 == (0x08 & flag3)); + bool bUseItalic = (0x10 == (0x10 & flag3)); + bool bUseBold = (0x20 == (0x20 & flag3)); - bool bVertical = (0x20 == (0x20 & flag2)); - bool bUseVertical = (0x20 == (0x20 & flag4)); + bool bVertical = (0x20 == (0x20 & flag2)); + bool bUseVertical = (0x20 == (0x20 & flag4)); - if (bUseStrikethrought) - { - pParentShape->m_oText.m_oAttributes.m_oFont.Strikeout = (BYTE)bStrikethrought; - } - if (bUseShadow) - { - pParentShape->m_oText.m_oAttributes.m_oTextShadow.Visible = true; - } - if (bUseUnderline) - { - pParentShape->m_oText.m_oAttributes.m_oFont.Underline = (BYTE)bUnderline; - } - if (bUseItalic) - { - pParentShape->m_oText.m_oAttributes.m_oFont.Italic = bItalic; - } - if (bUseBold) - { - pParentShape->m_oText.m_oAttributes.m_oFont.Bold = bBold; - } - if (bUseVertical) - { - pParentShape->m_oText.m_bVertical = (true == bVertical) ? true : false; - } - }break; - case ODRAW::cdirFont: - { - switch (pProperty->m_lValue) - { - case 1: - pParentShape->m_oText.m_bVertical = true; - break; - case 2: - pParentShape->m_oText.m_oAttributes.m_dTextRotate = 180; - break; - case 3: - pParentShape->m_oText.m_bVertical = true; - pParentShape->m_oText.m_oAttributes.m_dTextRotate = 180; - break; - } - }break; - case ODRAW::txflTextFlow: - { - pParentShape->m_oText.m_nTextFlow = pProperty->m_lValue; - }break; - case ODRAW::textBooleanProperties: - { - BYTE flag1 = (BYTE)(pProperty->m_lValue); - BYTE flag2 = (BYTE)(pProperty->m_lValue >> 8); - BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); - BYTE flag4 = (BYTE)(pProperty->m_lValue >> 24); + if (bUseStrikethrought) + { + pParentShape->m_oText.m_oAttributes.m_oFont.Strikeout = (BYTE)bStrikethrought; + } + if (bUseShadow) + { + pParentShape->m_oText.m_oAttributes.m_oTextShadow.Visible = true; + } + if (bUseUnderline) + { + pParentShape->m_oText.m_oAttributes.m_oFont.Underline = (BYTE)bUnderline; + } + if (bUseItalic) + { + pParentShape->m_oText.m_oAttributes.m_oFont.Italic = bItalic; + } + if (bUseBold) + { + pParentShape->m_oText.m_oAttributes.m_oFont.Bold = bBold; + } + if (bUseVertical) + { + pParentShape->m_oText.m_bVertical = (true == bVertical) ? true : false; + } + }break; + case ODRAW::cdirFont: + { + switch (pProperty->m_lValue) + { + case 1: + pParentShape->m_oText.m_bVertical = true; + break; + case 2: + pParentShape->m_oText.m_oAttributes.m_dTextRotate = 180; + break; + case 3: + pParentShape->m_oText.m_bVertical = true; + pParentShape->m_oText.m_oAttributes.m_dTextRotate = 180; + break; + } + }break; + case ODRAW::txflTextFlow: + { + pParentShape->m_oText.m_nTextFlow = pProperty->m_lValue; + }break; + case ODRAW::textBooleanProperties: + { + BYTE flag1 = (BYTE)(pProperty->m_lValue); + BYTE flag2 = (BYTE)(pProperty->m_lValue >> 8); + BYTE flag3 = (BYTE)(pProperty->m_lValue >> 16); + BYTE flag4 = (BYTE)(pProperty->m_lValue >> 24); - bool bFitShapeToText = (0x02 == (0x02 & flag1)); - bool bAutoTextMargin = (0x08 == (0x08 & flag1)); - bool bSelectText = (0x10 == (0x10 & flag1)); + bool bFitShapeToText = (0x02 == (0x02 & flag1)); + bool bAutoTextMargin = (0x08 == (0x08 & flag1)); + bool bSelectText = (0x10 == (0x10 & flag1)); - bool bUseFitShapeToText = (0x02 == (0x02 & flag3)); - bool bUseAutoTextMargin = (0x08 == (0x08 & flag3)); - bool bUseSelectText = (0x10 == (0x10 & flag3)); + bool bUseFitShapeToText = (0x02 == (0x02 & flag3)); + bool bUseAutoTextMargin = (0x08 == (0x08 & flag3)); + bool bUseSelectText = (0x10 == (0x10 & flag3)); - if (bUseAutoTextMargin) - { - if (bAutoTextMargin) - { - pParentShape->m_dTextMarginX = 2.54; - pParentShape->m_dTextMarginRight = 1.27; - pParentShape->m_dTextMarginY = 2.54; - pParentShape->m_dTextMarginBottom = 1.27; - } - } - if (bUseFitShapeToText) - pParentShape->m_oText.m_bAutoFit = bFitShapeToText; + if (bUseAutoTextMargin) + { + if (bAutoTextMargin) + { + pParentShape->m_dTextMarginX = 2.54; + pParentShape->m_dTextMarginRight = 1.27; + pParentShape->m_dTextMarginY = 2.54; + pParentShape->m_dTextMarginBottom = 1.27; + } + } + if (bUseFitShapeToText) + pParentShape->m_oText.m_bAutoFit = bFitShapeToText; - }break; - case ODRAW::c3DSpecularAmt: - { - pShape->m_o3dOptions.dSpecularAmt = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DDiffuseAmt: - { - pShape->m_o3dOptions.dDiffuseAmt = FixedPointToDouble(pProperty->m_lValue); - }break; + }break; + case ODRAW::c3DSpecularAmt: + { + pShape->m_o3dOptions.dSpecularAmt = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DDiffuseAmt: + { + pShape->m_o3dOptions.dDiffuseAmt = FixedPointToDouble(pProperty->m_lValue); + }break; case ODRAW::c3DShininess: - { - pShape->m_o3dOptions.dShininess = FixedPointToDouble(pProperty->m_lValue); - }break; + { + pShape->m_o3dOptions.dShininess = FixedPointToDouble(pProperty->m_lValue); + }break; case ODRAW::c3DEdgeThickness: - { - pShape->m_o3dOptions.nEdgeThickness = pProperty->m_lValue; - }break; - case ODRAW::C3DExtrudeForward: - { - pShape->m_o3dOptions.nExtrudeForward = pProperty->m_lValue; - }break; - case ODRAW::c3DExtrudeBackward: - { - pShape->m_o3dOptions.nExtrudeBackward = pProperty->m_lValue; - }break; - case ODRAW::c3DExtrudePlane: - { - //ExtrudePlane = 0; - }break; - case ODRAW::c3DExtrusionColor: - { - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); + { + pShape->m_o3dOptions.nEdgeThickness = pProperty->m_lValue; + }break; + case ODRAW::C3DExtrudeForward: + { + pShape->m_o3dOptions.nExtrudeForward = pProperty->m_lValue; + }break; + case ODRAW::c3DExtrudeBackward: + { + pShape->m_o3dOptions.nExtrudeBackward = pProperty->m_lValue; + }break; + case ODRAW::c3DExtrudePlane: + { + //ExtrudePlane = 0; + }break; + case ODRAW::c3DExtrusionColor: + { + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); - CColor tmp; - if(oAtom.bSysIndex) tmp = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else oAtom.ToColor(&tmp); + CColor tmp; + if(oAtom.bSysIndex) tmp = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else oAtom.ToColor(&tmp); - pShape->m_o3dOptions.oExtrusionColor = tmp; - }break; - case ODRAW::c3DCrMod: - { - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); + pShape->m_o3dOptions.oExtrusionColor = tmp; + }break; + case ODRAW::c3DCrMod: + { + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); - CColor tmp; - if(oAtom.bSysIndex) tmp = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else oAtom.ToColor(&tmp); - - pShape->m_o3dOptions.oCrMod = tmp; - }break; - case ODRAW::c3DExtrusionColorExt: - { - SColorAtom oAtom; - oAtom.FromValue(pProperty->m_lValue); + CColor tmp; + if(oAtom.bSysIndex) tmp = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else oAtom.ToColor(&tmp); - CColor tmp; - if(oAtom.bSysIndex) tmp = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); - else oAtom.ToColor(&tmp); - pShape->m_o3dOptions.oExtrusionColorExt = tmp; - }break; - case ODRAW::c3DExtrusionColorExtMod: - { - pShape->m_o3dOptions.nTypeExtrusionColorExt = (pProperty->m_lValue & 0x00000300) >> 8; - }break; - case ODRAW::c3DBottomBevelWidth: - { - pShape->m_o3dOptions.dBottomBevelWidth = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DBottomBevelHeight: - { - pShape->m_o3dOptions.dBottomBevelHeight = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DBottomBevelType: - { - pShape->m_o3dOptions.nBottomBevelType = pProperty->m_lValue; - }break; - case ODRAW::c3DTopBevelWidth: - { - pShape->m_o3dOptions.dTopBevelWidth = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DTopBevelHeight: - { - pShape->m_o3dOptions.dTopBevelHeight = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DTopBevelType: - { - pShape->m_o3dOptions.nTopBevelType = pProperty->m_lValue; - }break; - case ODRAW::threeDObjectBooleanProperties: - { - bool fUsef3D = GETBIT(pProperty->m_lValue, 19); - bool fUsefc3DMetallic = GETBIT(pProperty->m_lValue, 18); - bool fUsefc3DUseExtrusionColor = GETBIT(pProperty->m_lValue, 17); - bool fUsefc3DLightFace = GETBIT(pProperty->m_lValue, 16); - - pShape->m_o3dOptions.bEnabled = fUsef3D ? GETBIT(pProperty->m_lValue, 3) : false; - pShape->m_o3dOptions.bMetallic = fUsefc3DMetallic ? GETBIT(pProperty->m_lValue, 2) : false; - pShape->m_o3dOptions.bExtrusionColor= fUsefc3DUseExtrusionColor ? GETBIT(pProperty->m_lValue, 1) : false; - pShape->m_o3dOptions.bLightFace = fUsefc3DLightFace ? GETBIT(pProperty->m_lValue, 0) : true; + pShape->m_o3dOptions.oCrMod = tmp; + }break; + case ODRAW::c3DExtrusionColorExt: + { + SColorAtom oAtom; + oAtom.FromValue(pProperty->m_lValue); - }break; - case ODRAW::c3DYRotationAngle: - { - double val = FixedPointToDouble(pProperty->m_lValue); - if (val < 0) val += 360; - pShape->m_o3dOptions.dYRotationAngle = val; - }break; - case ODRAW::c3DXRotationAngle: - { - double val = FixedPointToDouble(pProperty->m_lValue); - if (val < 0) val += 360; - pShape->m_o3dOptions.dXRotationAngle = val; - }break; - case ODRAW::c3DRotationAxisX: - { - pShape->m_o3dOptions.dRotationAxisX = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DRotationAxisY: - { - pShape->m_o3dOptions.dRotationAxisY = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DRotationAxisZ: - { - pShape->m_o3dOptions.dRotationAxisZ = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DRotationAngle: - { - pShape->m_o3dOptions.dRotationAngle = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DRotationCenterX: - { - pShape->m_o3dOptions.dRotationCenterX = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DRotationCenterY: - { - pShape->m_o3dOptions.dRotationCenterY = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DRotationCenterZ: - { - pShape->m_o3dOptions.dRotationCenterZ = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DRenderMode: - { - pShape->m_o3dOptions.nRenderMode = pProperty->m_lValue; - }break; - case ODRAW::c3DTolerance: - { - pShape->m_o3dOptions.dTolerance = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DXViewpoint: - { - pShape->m_o3dOptions.dXViewpoint = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DYViewpoint: - { - pShape->m_o3dOptions.dYViewpoint = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DZViewpoint: - { - pShape->m_o3dOptions.dZViewpoint = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DOriginX: - { - pShape->m_o3dOptions.dOriginX = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DOriginY: - { - pShape->m_o3dOptions.dOriginY = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DSkewAngle: - { - double val = FixedPointToDouble(pProperty->m_lValue); - if (val <= 0) val += 360; - pShape->m_o3dOptions.dSkewAngle = val; - }break; - case ODRAW::c3DSkewAmount: - { - pShape->m_o3dOptions.nSkewAmount = pProperty->m_lValue; - }break; - case ODRAW::c3DAmbientIntensity: - { - pShape->m_o3dOptions.dAmbientIntensity = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DKeyX: - { - pShape->m_o3dOptions.dKeyX = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DKeyY: - { - pShape->m_o3dOptions.dKeyY = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DKeyZ: - { - pShape->m_o3dOptions.dKeyZ = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DKeyIntensity: - { - pShape->m_o3dOptions.dKeyIntensity = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DFillX: - { - pShape->m_o3dOptions.dFillX = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DFillY: - { - pShape->m_o3dOptions.dFillY = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DFillZ: - { - pShape->m_o3dOptions.dFillZ = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::c3DFillIntensity: - { - pShape->m_o3dOptions.dFillIntensity = FixedPointToDouble(pProperty->m_lValue); - }break; - case ODRAW::threeDStyleBooleanProperties: - { - bool fUsefc3DConstrainRotation = GETBIT(pProperty->m_lValue, 20); - bool fUsefc3DRotationCenterAuto = GETBIT(pProperty->m_lValue, 19); - bool fUsefc3DParallel = GETBIT(pProperty->m_lValue, 18); - bool fUsefc3DKeyHarsh = GETBIT(pProperty->m_lValue, 17); - bool fUsefc3DFillHarsh = GETBIT(pProperty->m_lValue, 16); - - pShape->m_o3dOptions.bConstrainRotation = fUsefc3DConstrainRotation ? GETBIT(pProperty->m_lValue, 4) : true; - pShape->m_o3dOptions.bRotationCenterAuto= fUsefc3DRotationCenterAuto? GETBIT(pProperty->m_lValue, 3) : false; - pShape->m_o3dOptions.bParallel = fUsefc3DParallel ? GETBIT(pProperty->m_lValue, 2) : true; - pShape->m_o3dOptions.bKeyHarsh = fUsefc3DKeyHarsh ? GETBIT(pProperty->m_lValue, 1) : true; - pShape->m_o3dOptions.bFillHarsh = fUsefc3DFillHarsh ? GETBIT(pProperty->m_lValue, 0) : true; - }break; - default: - { - int unknown_value = pProperty->m_lValue; - unknown_value = unknown_value; - }break; - } + CColor tmp; + if(oAtom.bSysIndex) tmp = CorrectSysColor(pProperty->m_lValue, pElement, pTheme); + else oAtom.ToColor(&tmp); + pShape->m_o3dOptions.oExtrusionColorExt = tmp; + }break; + case ODRAW::c3DExtrusionColorExtMod: + { + pShape->m_o3dOptions.nTypeExtrusionColorExt = (pProperty->m_lValue & 0x00000300) >> 8; + }break; + case ODRAW::c3DBottomBevelWidth: + { + pShape->m_o3dOptions.dBottomBevelWidth = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DBottomBevelHeight: + { + pShape->m_o3dOptions.dBottomBevelHeight = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DBottomBevelType: + { + pShape->m_o3dOptions.nBottomBevelType = pProperty->m_lValue; + }break; + case ODRAW::c3DTopBevelWidth: + { + pShape->m_o3dOptions.dTopBevelWidth = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DTopBevelHeight: + { + pShape->m_o3dOptions.dTopBevelHeight = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DTopBevelType: + { + pShape->m_o3dOptions.nTopBevelType = pProperty->m_lValue; + }break; + case ODRAW::threeDObjectBooleanProperties: + { + bool fUsef3D = GETBIT(pProperty->m_lValue, 19); + bool fUsefc3DMetallic = GETBIT(pProperty->m_lValue, 18); + bool fUsefc3DUseExtrusionColor = GETBIT(pProperty->m_lValue, 17); + bool fUsefc3DLightFace = GETBIT(pProperty->m_lValue, 16); + + pShape->m_o3dOptions.bEnabled = fUsef3D ? GETBIT(pProperty->m_lValue, 3) : false; + pShape->m_o3dOptions.bMetallic = fUsefc3DMetallic ? GETBIT(pProperty->m_lValue, 2) : false; + pShape->m_o3dOptions.bExtrusionColor= fUsefc3DUseExtrusionColor ? GETBIT(pProperty->m_lValue, 1) : false; + pShape->m_o3dOptions.bLightFace = fUsefc3DLightFace ? GETBIT(pProperty->m_lValue, 0) : true; + + }break; + case ODRAW::c3DYRotationAngle: + { + double val = FixedPointToDouble(pProperty->m_lValue); + if (val < 0) val += 360; + pShape->m_o3dOptions.dYRotationAngle = val; + }break; + case ODRAW::c3DXRotationAngle: + { + double val = FixedPointToDouble(pProperty->m_lValue); + if (val < 0) val += 360; + pShape->m_o3dOptions.dXRotationAngle = val; + }break; + case ODRAW::c3DRotationAxisX: + { + pShape->m_o3dOptions.dRotationAxisX = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DRotationAxisY: + { + pShape->m_o3dOptions.dRotationAxisY = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DRotationAxisZ: + { + pShape->m_o3dOptions.dRotationAxisZ = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DRotationAngle: + { + pShape->m_o3dOptions.dRotationAngle = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DRotationCenterX: + { + pShape->m_o3dOptions.dRotationCenterX = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DRotationCenterY: + { + pShape->m_o3dOptions.dRotationCenterY = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DRotationCenterZ: + { + pShape->m_o3dOptions.dRotationCenterZ = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DRenderMode: + { + pShape->m_o3dOptions.nRenderMode = pProperty->m_lValue; + }break; + case ODRAW::c3DTolerance: + { + pShape->m_o3dOptions.dTolerance = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DXViewpoint: + { + pShape->m_o3dOptions.dXViewpoint = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DYViewpoint: + { + pShape->m_o3dOptions.dYViewpoint = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DZViewpoint: + { + pShape->m_o3dOptions.dZViewpoint = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DOriginX: + { + pShape->m_o3dOptions.dOriginX = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DOriginY: + { + pShape->m_o3dOptions.dOriginY = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DSkewAngle: + { + double val = FixedPointToDouble(pProperty->m_lValue); + if (val <= 0) val += 360; + pShape->m_o3dOptions.dSkewAngle = val; + }break; + case ODRAW::c3DSkewAmount: + { + pShape->m_o3dOptions.nSkewAmount = pProperty->m_lValue; + }break; + case ODRAW::c3DAmbientIntensity: + { + pShape->m_o3dOptions.dAmbientIntensity = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DKeyX: + { + pShape->m_o3dOptions.dKeyX = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DKeyY: + { + pShape->m_o3dOptions.dKeyY = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DKeyZ: + { + pShape->m_o3dOptions.dKeyZ = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DKeyIntensity: + { + pShape->m_o3dOptions.dKeyIntensity = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DFillX: + { + pShape->m_o3dOptions.dFillX = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DFillY: + { + pShape->m_o3dOptions.dFillY = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DFillZ: + { + pShape->m_o3dOptions.dFillZ = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::c3DFillIntensity: + { + pShape->m_o3dOptions.dFillIntensity = FixedPointToDouble(pProperty->m_lValue); + }break; + case ODRAW::threeDStyleBooleanProperties: + { + bool fUsefc3DConstrainRotation = GETBIT(pProperty->m_lValue, 20); + bool fUsefc3DRotationCenterAuto = GETBIT(pProperty->m_lValue, 19); + bool fUsefc3DParallel = GETBIT(pProperty->m_lValue, 18); + bool fUsefc3DKeyHarsh = GETBIT(pProperty->m_lValue, 17); + bool fUsefc3DFillHarsh = GETBIT(pProperty->m_lValue, 16); + + pShape->m_o3dOptions.bConstrainRotation = fUsefc3DConstrainRotation ? GETBIT(pProperty->m_lValue, 4) : true; + pShape->m_o3dOptions.bRotationCenterAuto= fUsefc3DRotationCenterAuto? GETBIT(pProperty->m_lValue, 3) : false; + pShape->m_o3dOptions.bParallel = fUsefc3DParallel ? GETBIT(pProperty->m_lValue, 2) : true; + pShape->m_o3dOptions.bKeyHarsh = fUsefc3DKeyHarsh ? GETBIT(pProperty->m_lValue, 1) : true; + pShape->m_o3dOptions.bFillHarsh = fUsefc3DFillHarsh ? GETBIT(pProperty->m_lValue, 0) : true; + }break; + default: + { + int unknown_value = pProperty->m_lValue; + unknown_value = unknown_value; + }break; + } } CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, - CTheme* pTheme, CLayout* pLayout, - CSlideInfo* pThemeWrapper, CSlideInfo* pSlideWrapper, CSlide* pSlide) + CTheme* pTheme, CLayout* pLayout, + CSlideInfo* pThemeWrapper, CSlideInfo* pSlideWrapper, CSlide* pSlide) { CElementPtr pElement; @@ -1530,8 +1537,8 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, for (size_t nIndex = 0; nIndex < nIndexMem; ++nIndex) { if ((placeholder_type == pLayout->m_arElements[nIndex]->m_lPlaceholderType ) && - ( placeholder_id < 0 || pLayout->m_arElements[nIndex]->m_lPlaceholderID < 0 || - placeholder_id == pLayout->m_arElements[nIndex]->m_lPlaceholderID)) + ( placeholder_id < 0 || pLayout->m_arElements[nIndex]->m_lPlaceholderID < 0 || + placeholder_id == pLayout->m_arElements[nIndex]->m_lPlaceholderID)) { if (pLayout->m_arElements[nIndex]->m_bPlaceholderSet == false) { @@ -1568,93 +1575,100 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, case sptNil: break; case sptPictureFrame: - { - std::vector oArrayEx; - GetRecordsByType(&oArrayEx, true, true); + { + std::vector oArrayEx; + GetRecordsByType(&oArrayEx, true, true); - CExFilesInfo oInfo; - CExFilesInfo oInfoDefault; - // по умолчанию картинка (или оле объект) - CExFilesInfo::ExFilesType exType = CExFilesInfo::eftNone; - CExFilesInfo* pInfo = pMapIDs->Lock(0xFFFFFFFF, exType); + CExFilesInfo oInfo; + CExFilesInfo oInfoDefault; + // по умолчанию картинка (или оле объект) + CExFilesInfo::ExFilesType exType = CExFilesInfo::eftNone; + CExFilesInfo* pInfo = pMapIDs->Lock(0xFFFFFFFF, exType); + if (NULL != pInfo) + { + oInfo = *pInfo; + oInfoDefault = oInfo; + } + + if (0 != oArrayEx.size()) + { + pInfo = pMapIDs->Lock(oArrayEx[0]->m_nExObjID, exType); if (NULL != pInfo) { - oInfo = *pInfo; - oInfoDefault = oInfo; + oInfo = *pInfo; } + } - if (0 != oArrayEx.size()) - { - pInfo = pMapIDs->Lock(oArrayEx[0]->m_nExObjID, exType); - if (NULL != pInfo) - { - oInfo = *pInfo; - } - } - - if (CExFilesInfo::eftVideo == exType) - { - CVideoElement* pVideoElem = new CVideoElement(); - - pVideoElem->m_strVideoFileName = oInfo.m_strFilePath ; - pVideoElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; - - pElement = CElementPtr(pVideoElem); - } - else if (CExFilesInfo::eftAudio == exType) - { - CAudioElement* pAudioElem = new CAudioElement(); - pElement = CElementPtr(pAudioElem); - - pAudioElem->m_strAudioFileName = oInfo.m_strFilePath; - pAudioElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; - - pAudioElem->m_dClipStartTime = oInfo.m_dStartTime; - pAudioElem->m_dClipEndTime = oInfo.m_dEndTime; - - pAudioElem->m_bLoop = oInfo.m_bLoop; - - if (NULL != pSlide) - { - pAudioElem->m_dStartTime = pSlide->m_dStartTime; - pAudioElem->m_dEndTime = pSlide->m_dEndTime; - - } - else - { - if (pLayout) - pLayout->m_arElements.push_back(pElement); - } - - } - else - { - CImageElement* pImageElem = new CImageElement(); - pImageElem->m_strImageFileName = oInfo.m_strFilePath + FILE_SEPARATOR_STR; - - pElement = CElementPtr(pImageElem); - } - }break; - default: + if (CExFilesInfo::eftVideo == exType) { - if (bGroupShape) + CVideoElement* pVideoElem = new CVideoElement(); + + pVideoElem->m_strVideoFileName = oInfo.m_strFilePath ; + pVideoElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; + + pElement = CElementPtr(pVideoElem); + } + else if (CExFilesInfo::eftAudio == exType) + { + CAudioElement* pAudioElem = new CAudioElement(); + pElement = CElementPtr(pAudioElem); + + pAudioElem->m_strAudioFileName = oInfo.m_strFilePath; + pAudioElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; + + pAudioElem->m_dClipStartTime = oInfo.m_dStartTime; + pAudioElem->m_dClipEndTime = oInfo.m_dEndTime; + + pAudioElem->m_bLoop = oInfo.m_bLoop; + + if (NULL != pSlide) { - CGroupElement* pGroupElem = new CGroupElement(); - pElement = CElementPtr(pGroupElem); + pAudioElem->m_dStartTime = pSlide->m_dStartTime; + pAudioElem->m_dEndTime = pSlide->m_dEndTime; + } else { - // shape - CShapeElement* pShape = new CShapeElement(NSBaseShape::ppt, eType); - CPPTShape *ppt_shape = dynamic_cast(pShape->m_pShape->getBaseShape().get()); - - if ( (ppt_shape) && (OOXMLShapes::sptCustom == ppt_shape->m_eType)) - { - pShape->m_bShapePreset = true; - } - pElement = CElementPtr(pShape); + if (pLayout) + pLayout->m_arElements.push_back(pElement); } - }break; + + } + else + { + CImageElement* pImageElem = new CImageElement(); + pImageElem->m_strImageFileName = oInfo.m_strFilePath + FILE_SEPARATOR_STR; + + pElement = CElementPtr(pImageElem); + } + }break; + default: + { + if (isTable()) + { + CTableElement* pTableElem = new CTableElement(); + pTableElem->m_xmlRawData = getTableXmlStr(); + pTableElem->m_etType = etGroup; + pElement = CElementPtr(pTableElem); + } + else if (bGroupShape) + { + CGroupElement* pGroupElem = new CGroupElement(); + pElement = CElementPtr(pGroupElem); + } + else + { + // shape + CShapeElement* pShape = new CShapeElement(NSBaseShape::ppt, eType); + CPPTShape *ppt_shape = dynamic_cast(pShape->m_pShape->getBaseShape().get()); + + if ( (ppt_shape) && (OOXMLShapes::sptCustom == ppt_shape->m_eType)) + { + pShape->m_bShapePreset = true; + } + pElement = CElementPtr(pShape); + } + }break; } } @@ -1664,7 +1678,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, pElement->m_lID = oArrayShape[0]->m_nID; pElement->m_lLayoutID = lMasterID; -//---------внешние ссылки + //---------внешние ссылки { CExFilesInfo::ExFilesType exType = CExFilesInfo::eftNone; CExFilesInfo * pTextureInfo = pMapIDs->Lock(0xFFFFFFFF, exType); @@ -1687,7 +1701,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, } } std::wstring strShapeText; -//------------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------------ // placeholders if (0 < oArrayPlaceHolder.size()) { @@ -1751,7 +1765,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, pElement->m_nFormatDate = 2; } } -//------------- привязки --------------------------------------------------------------------------------- + //------------- привязки --------------------------------------------------------------------------------- std::vector oArrayGroupShape; this->GetRecordsByType(&oArrayGroupShape, true, true); @@ -1805,7 +1819,25 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, pElementLayout->m_bAnchorEnabled = pElement->m_bAnchorEnabled; pElementLayout->m_bChildAnchorEnabled = pElement->m_bChildAnchorEnabled; } -//--------- наличие текста -------------------------------------------------------------------------- + + std::vector oArrayArtClient; + GetRecordsByType(&oArrayArtClient, false, true); + std::vector oArrayInteractive; + + if (oArrayArtClient.size()) + oArrayArtClient[0]->GetRecordsByType(&oArrayInteractive, true, false); + + for (auto const* interactiveCont : oArrayInteractive) + { + CInteractiveInfo interactiveInfo; + ConvertInteractiveInfo(interactiveInfo, interactiveCont, pMapIDs); + + pElement->m_arrActions.push_back(interactiveInfo); + } + + + + //--------- наличие текста -------------------------------------------------------------------------- CShapeElement* pShapeElem = dynamic_cast(pElement.get()); if (NULL != pShapeElem) { @@ -1848,6 +1880,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, if (0 < oArrayTextBytes.size() && strShapeText.empty()) { strShapeText = oArrayTextBytes[0]->m_strText; + pShapeElem->m_pShape->m_oText.m_originalText = strShapeText; } std::vector oArrayTextChars; @@ -1864,7 +1897,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, if (pos < 0) pElement->m_lPlaceholderType = PT_MasterFooter; ///???? 1-(33).ppt } -//------ shape properties ---------------------------------------------------------------------------------------- + //------ shape properties ---------------------------------------------------------------------------------------- CPPTElement oElement; for (size_t nIndexProp = 0; nIndexProp < oArrayOptions.size(); ++nIndexProp) { @@ -1894,47 +1927,25 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, pShapeElem->m_pShape->m_oText.m_oRuler = oArrayTextRuler[0]->m_oTextRuler; } - std::vector oArrayInteractive; - GetRecordsByType(&oArrayInteractive, true, false); - if (oArrayInteractive.size() == 2) - oArrayInteractive[1]->m_oHeader.RecInstance = 1; - for (auto const* interactiveAtom : oArrayInteractive) + std::vector oArrayTextBox; + std::vector oArrayInteractiveCont; + std::vector oArrayTextInteractive; + this->GetRecordsByType(&oArrayTextBox, false); + + if (oArrayTextBox.size()) { - CInteractiveInfo interactiveInfo; - interactiveInfo.m_bPresent = true; - interactiveInfo.m_eActivation = (bool)interactiveAtom->m_oHeader.RecInstance; + oArrayTextBox[0]->GetRecordsByType(&oArrayTextInteractive, false); - if (pMapIDs) - { - CExFilesInfo* pInfo1 = pMapIDs->LockAudioFromCollection(interactiveAtom->m_nSoundIdRef); - if (NULL != pInfo1) - { - interactiveInfo.m_strAudioFileName = pInfo1->m_strFilePath; - interactiveInfo.m_strAudioName = pInfo1->m_name; - } - CExFilesInfo* pInfo2 = pMapIDs->LockHyperlink(interactiveAtom->m_nExHyperlinkIdRef); - if (NULL != pInfo2) - { - interactiveInfo.m_strHyperlink = pInfo2->m_strLocation; - } - } - - interactiveInfo.m_lType = interactiveAtom->m_nAction; - interactiveInfo.m_lOleVerb = interactiveAtom->m_nOleVerb; - interactiveInfo.m_lJump = interactiveAtom->m_nJump; - interactiveInfo.m_lHyperlinkType = interactiveAtom->m_nHyperlinkType; - - interactiveInfo.m_bAnimated = interactiveAtom->m_bAnimated; - interactiveInfo.m_bStopSound = interactiveAtom->m_bStopSound; - interactiveInfo.m_bCustomShowReturn = interactiveAtom->m_bCustomShowReturn; - interactiveInfo.m_bVisited = interactiveAtom->m_bVisited; - - pShapeElem->m_arrActions.push_back(interactiveInfo); +// oArrayTextBox[0]->GetRecordsByType(&oArrayInteractiveCont, false); } - std::vector oArrayTextInteractive; - this->GetRecordsByType(&oArrayTextInteractive, true); + for (const auto* pInerAtom : oArrayInteractiveCont) + { + CInteractiveInfo interactive; + ConvertInteractiveInfo(interactive, pInerAtom, pMapIDs); + pShapeElem->m_textHyperlinks.push_back(interactive); + } if (!oArrayTextInteractive.empty()) { @@ -2015,7 +2026,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, pElement->m_lLayoutID = lMasterID; } -//---------------------------------------------------------------------------------------------------- + //---------------------------------------------------------------------------------------------------- if (NULL != pSlide) { pElement->m_dStartTime = pSlide->m_dStartTime; @@ -2030,56 +2041,113 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, return pElement; } +bool CRecordShapeContainer::isTable() const +{ + std::vector oArrayOptions; + GetRecordsByType(&oArrayOptions, true, false); + + for (const auto* option : oArrayOptions) + { + for (const auto& prop : option->m_oProperties.m_arProperties) + { + if ((prop.m_ePID == tableProperties || + prop.m_ePID == tableRowProperties) && + bGroupShape) + { + return true; + } + } + } + return false; +} + +std::wstring CRecordShapeContainer::getTableXmlStr() const +{ + std::vector oArrayOptions; + GetRecordsByType(&oArrayOptions, true, false); + std::wstring xmlStr = L""; + + if (oArrayOptions.size() >= 2 && + oArrayOptions[1]->m_oProperties.m_arProperties.size() >= 3) + { + COfficeUtils officeUtils(NULL); + BYTE *utf8Data = NULL; + ULONG utf8DataSize = 0; + auto& xmlProp = oArrayOptions[1]->m_oProperties.m_arProperties[2]; + NSFile::CFileBinary file; + + std::wstring temp = NSDirectory::GetTempPath(); + + std::wstring tempFileName = temp + FILE_SEPARATOR_STR + L"tempMetroBlob.zip"; + + if (file.CreateFileW(tempFileName)) + { + file.WriteFile(xmlProp.m_pOptions, xmlProp.m_lValue); + file.CloseFile(); + } + + if (S_OK == officeUtils.LoadFileFromArchive(tempFileName, L"drs/e2oDoc.xml", &utf8Data, utf8DataSize)) + { + xmlStr = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8(utf8Data, utf8DataSize); + } + + delete [] utf8Data; + NSFile::CFileBinary::Remove(tempFileName); + } + + return xmlStr; +} + void CRecordShapeContainer::ApplyThemeStyle(CElementPtr pElem, CTheme* pTheme, CRecordMasterTextPropAtom* master_levels) { - CShapeElement* pShape = dynamic_cast(pElem.get()); - if (NULL == pShape) - return; - - CTextAttributesEx* pText = &(pShape->m_pShape->m_oText); + CShapeElement* pShape = dynamic_cast(pElem.get()); + if (NULL == pShape) + return; - - if (master_levels) - { - for (size_t i = 0; i < pText->m_arParagraphs.size(); i++) - { - if (i >= master_levels->m_arrProps.size()) break; - - pText->m_arParagraphs[i].m_lTextLevel = master_levels->m_arrProps[i].lIndentLevel; - pText->m_arParagraphs[i].m_oPFRun.leftMargin.reset(); - pText->m_arParagraphs[i].m_oPFRun.indent.reset(); - } - } + CTextAttributesEx* pText = &(pShape->m_pShape->m_oText); - pText->ApplyThemeStyle(pTheme); + + if (master_levels) + { + for (size_t i = 0; i < pText->m_arParagraphs.size(); i++) + { + if (i >= master_levels->m_arrProps.size()) break; + + pText->m_arParagraphs[i].m_lTextLevel = master_levels->m_arrProps[i].lIndentLevel; + pText->m_arParagraphs[i].m_oPFRun.leftMargin.reset(); + pText->m_arParagraphs[i].m_oPFRun.indent.reset(); + } + } + + pText->ApplyThemeStyle(pTheme); } void CRecordShapeContainer::SetUpTextStyle(std::wstring& strText, CTheme* pTheme, CLayout* pLayout, CElementPtr pElem, CSlideInfo* pThemeWrapper, CSlideInfo* pSlideWrapper, CSlide* pSlide, CRecordMasterTextPropAtom* master_levels) { - // сначала проверяем на shape - // затем применяем все настройки по-очереди - // 1) master + TextMasterStyles - // 2) persist + TextMasterStyles - // 3) свои настройки + TextMasterStyles - // причем "свои настройки" - это чисто "продвинутые настройки" - // потому что все общие ( через проперти ) - уже установлены + // сначала проверяем на shape + // затем применяем все настройки по-очереди + // 1) master + TextMasterStyles + // 2) persist + TextMasterStyles + // 3) свои настройки + TextMasterStyles + // причем "свои настройки" - это чисто "продвинутые настройки" + // потому что все общие ( через проперти ) - уже установлены - if (NULL == pElem) - return; + if (NULL == pElem) + return; - if (etShape != pElem->m_etType) - return; + if (etShape != pElem->m_etType) + return; - CShapeElement* pShape = dynamic_cast(pElem.get()); - if (NULL == pShape) - return; + CShapeElement* pShape = dynamic_cast(pElem.get()); + if (NULL == pShape) + return; - CTextAttributesEx* pTextSettings = &(pShape->m_pShape->m_oText); + CTextAttributesEx* pTextSettings = &(pShape->m_pShape->m_oText); - // сначала применим ссылки на masterstyle (для шаблонного элемента) - // как узнать - просто есть ли массивы (т.к. они могли появиться пока только оттуда) - // - теперь этого делать не нужно - т.к. в мастере тоже вызывается эта функция - - // и там все это должно уже примениться + // сначала применим ссылки на masterstyle (для шаблонного элемента) + // как узнать - просто есть ли массивы (т.к. они могли появиться пока только оттуда) + // - теперь этого делать не нужно - т.к. в мастере тоже вызывается эта функция - + // и там все это должно уже примениться bool bIsPersistPresentSettings = false; bool bIsOwnPresentSettings = false; @@ -2087,15 +2155,15 @@ void CRecordShapeContainer::SetUpTextStyle(std::wstring& strText, CTheme* pTheme TextTypeEnum eTypePersist = NoPresent; TextTypeEnum eTypeOwn = (TextTypeEnum)pTextSettings->m_lTextType; - CShapeElement* pElementLayoutPH = NULL; + CShapeElement* pElementLayoutPH = NULL; - // выставим тип мастера - if (NULL != pSlide) - { - int ph_type = pShape->m_lPlaceholderType; - int ph_pos = pShape->m_lPlaceholderID; + // выставим тип мастера + if (NULL != pSlide) + { + int ph_type = pShape->m_lPlaceholderType; + int ph_pos = pShape->m_lPlaceholderID; - pTextSettings->m_lPlaceholderType = pShape->m_lPlaceholderType; + pTextSettings->m_lPlaceholderType = pShape->m_lPlaceholderType; size_t lElemsCount = 0; @@ -2112,444 +2180,541 @@ void CRecordShapeContainer::SetUpTextStyle(std::wstring& strText, CTheme* pTheme } } } - } - else - { + } + else + { eTypeMaster = (TextTypeEnum)pTextSettings->m_lTextMasterType; - } + } - // ------------------------------------------------------------------------------ - CElementInfo oElemInfo; - std::map::iterator pPair = pSlideWrapper->m_mapElements.find(pShape->m_lID); - if (pSlideWrapper->m_mapElements.end() != pPair) - oElemInfo = pPair->second; + // ------------------------------------------------------------------------------ + CElementInfo oElemInfo; + std::map::iterator pPair = pSlideWrapper->m_mapElements.find(pShape->m_lID); + if (pSlideWrapper->m_mapElements.end() != pPair) + oElemInfo = pPair->second; - // persist ---------------------------------------------------------------------- - std::vector* pArrayPlaceHolders = &pSlideWrapper->m_arTextPlaceHolders; - int lCountPersistObjects = pArrayPlaceHolders->size(); - int lPersistIndex = oElemInfo.m_lPersistIndex; + // persist ---------------------------------------------------------------------- + std::vector* pArrayPlaceHolders = &pSlideWrapper->m_arTextPlaceHolders; + int lCountPersistObjects = pArrayPlaceHolders->size(); + int lPersistIndex = oElemInfo.m_lPersistIndex; - if ((lPersistIndex >= 0) && (lPersistIndex < lCountPersistObjects)) - { - CTextFullSettings* pSettings = &pArrayPlaceHolders->at(lPersistIndex); + if ((lPersistIndex >= 0) && (lPersistIndex < lCountPersistObjects)) + { + CTextFullSettings* pSettings = &pArrayPlaceHolders->at(lPersistIndex); eTypePersist = (TextTypeEnum)pSettings->m_nTextType; - strText = pSettings->ApplyProperties(pTextSettings); + strText = pSettings->ApplyProperties(pTextSettings); - if ((0 != pSettings->m_arRanges.size()) && (0 == pShape->m_oTextActions.m_arRanges.size())) - { - pShape->m_oTextActions.m_bPresent = true; - - pShape->m_oTextActions.m_arRanges = pSettings->m_arRanges; - } + if ((0 != pSettings->m_arRanges.size()) && (0 == pShape->m_oTextActions.m_arRanges.size())) + { + pShape->m_oTextActions.m_bPresent = true; + pShape->m_oTextActions.m_arRanges = pSettings->m_arRanges; + } - bIsPersistPresentSettings = ((NULL != pSettings->m_pTextStyleProp) && (0 < pSettings->m_pTextStyleProp->m_lCount)); - } - // ------------------------------------------------------------------------------ + bIsPersistPresentSettings = ((NULL != pSettings->m_pTextStyleProp) && (0 < pSettings->m_pTextStyleProp->m_lCount)); + } + // ------------------------------------------------------------------------------ - if (NULL != oElemInfo.m_pStream && -1 != oElemInfo.m_lOffsetTextStyle) - { - // теперь нужно загрузить стили текста из стрима. - LONG lPosition = 0; StreamUtils::StreamPosition(lPosition, oElemInfo.m_pStream); + if (NULL != oElemInfo.m_pStream && -1 != oElemInfo.m_lOffsetTextStyle) + { + // теперь нужно загрузить стили текста из стрима. + LONG lPosition = 0; StreamUtils::StreamPosition(lPosition, oElemInfo.m_pStream); - StreamUtils::StreamSeek(oElemInfo.m_lOffsetTextStyle - 8, oElemInfo.m_pStream); + StreamUtils::StreamSeek(oElemInfo.m_lOffsetTextStyle - 8, oElemInfo.m_pStream); - SRecordHeader oHeader; - oHeader.ReadFromStream(oElemInfo.m_pStream) ; + SRecordHeader oHeader; + oHeader.ReadFromStream(oElemInfo.m_pStream) ; if (RT_StyleTextPropAtom == oHeader.RecType) - { - CRecordStyleTextPropAtom* pStyle = new CRecordStyleTextPropAtom(); - pStyle->m_lCount = strText.length(); + { + CRecordStyleTextPropAtom* pStyle = new CRecordStyleTextPropAtom(); + pStyle->m_lCount = strText.length(); - pStyle->ReadFromStream(oHeader, oElemInfo.m_pStream); + pStyle->ReadFromStream(oHeader, oElemInfo.m_pStream); - PPT_FORMAT::ConvertPPTTextToEditorStructure(pStyle->m_arrPFs, pStyle->m_arrCFs, strText, pShape->m_pShape->m_oText); + PPT_FORMAT::ConvertPPTTextToEditorStructure(pStyle->m_arrPFs, pStyle->m_arrCFs, strText, pShape->m_pShape->m_oText); - bIsOwnPresentSettings = (0 < pStyle->m_lCount); + bIsOwnPresentSettings = (0 < pStyle->m_lCount); - RELEASEOBJECT(pStyle); - } - StreamUtils::StreamSeek(lPosition, oElemInfo.m_pStream); - } + RELEASEOBJECT(pStyle); + } + StreamUtils::StreamSeek(lPosition, oElemInfo.m_pStream); + } - // ------------------------------------------------------------------------------ + // ------------------------------------------------------------------------------ - // теперь выставляем все настройки текста (стили) - if (NULL == pSlide) - { - int nTextMasterType = (int)eTypeMaster; - if (-1 != pShape->m_lPlaceholderType) - { - switch (oElemInfo.m_lMasterPlaceholderType) - { - case PT_Title: - case PT_MasterTitle: - case PT_VerticalTitle: - { - pTextSettings->m_lStyleThemeIndex = 1; + // теперь выставляем все настройки текста (стили) + if (NULL == pSlide) + { + int nTextMasterType = (int)eTypeMaster; + if (-1 != pShape->m_lPlaceholderType) + { + switch (oElemInfo.m_lMasterPlaceholderType) + { + case PT_Title: + case PT_MasterTitle: + case PT_VerticalTitle: + { + pTextSettings->m_lStyleThemeIndex = 1; - if (Tx_TYPE_TITLE != eTypeMaster) - { - if (0 <= nTextMasterType && nTextMasterType < 9) - { - if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) - pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); - } - } - break; - } - case PT_CenterTitle: - case PT_MasterCenterTitle: - { - pTextSettings->m_lStyleThemeIndex = 1; + if (Tx_TYPE_TITLE != eTypeMaster) + { + if (0 <= nTextMasterType && nTextMasterType < 9) + { + if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) + pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); + } + } + break; + } + case PT_CenterTitle: + case PT_MasterCenterTitle: + { + pTextSettings->m_lStyleThemeIndex = 1; - if (Tx_TYPE_TITLE != eTypeMaster) - { - if (0 <= nTextMasterType && nTextMasterType < 9) - { - if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) - pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); - } - } - break; - } - case PT_Body: - case PT_MasterBody: - case PT_NotesBody: - case PT_MasterNotesBody: - case PT_VerticalBody: - case PT_MasterSubTitle: - case PT_SubTitle: - { - pTextSettings->m_lStyleThemeIndex = 2; + if (Tx_TYPE_TITLE != eTypeMaster) + { + if (0 <= nTextMasterType && nTextMasterType < 9) + { + if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) + pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); + } + } + break; + } + case PT_Body: + case PT_MasterBody: + case PT_NotesBody: + case PT_MasterNotesBody: + case PT_VerticalBody: + case PT_MasterSubTitle: + case PT_SubTitle: + { + pTextSettings->m_lStyleThemeIndex = 2; - if ((Tx_TYPE_BODY != eTypeMaster) || !pLayout) - { - if (0 <= nTextMasterType && nTextMasterType < 9) - { - if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) - pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); - } - } - break; - } - default: - { - pTextSettings->m_lStyleThemeIndex = 3; + if ((Tx_TYPE_BODY != eTypeMaster) || !pLayout) + { + if (0 <= nTextMasterType && nTextMasterType < 9) + { + if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) + pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); + } + } + break; + } + default: + { + pTextSettings->m_lStyleThemeIndex = 3; - if ((Tx_TYPE_OTHER != eTypeMaster) || !pLayout) - { - if (0 <= nTextMasterType && nTextMasterType < 9) - { - if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) - { - pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); - } - } - } - break; - } - } - } - else - { - //pTextSettings->m_lTextType = 0; + if ((Tx_TYPE_OTHER != eTypeMaster) || !pLayout) + { + if (0 <= nTextMasterType && nTextMasterType < 9) + { + if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) + { + pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); + } + } + } + break; + } + } + } + else + { + //pTextSettings->m_lTextType = 0; - //if (Other != eTypeMaster) - //{ - // if (0 <= nTextMasterType && nTextMasterType < 9) - // { - // if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) - // pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); - // } - //} - } + //if (Other != eTypeMaster) + //{ + // if (0 <= nTextMasterType && nTextMasterType < 9) + // { + // if (pThemeWrapper->m_pStyles[nTextMasterType].is_init()) + // pTextSettings->m_oStyles = pThemeWrapper->m_pStyles[nTextMasterType].get(); + // } + //} + } - // теперь смотрим все остальные стили (persist и own) - просто применяем их к m_oStyles - if (eTypePersist != NoPresent && eTypePersist != eTypeMaster) - { - int nIndexType = (int)eTypePersist; - if (0 <= nIndexType && nIndexType < 9) - { - if (pThemeWrapper->m_pStyles[nIndexType].is_init()) - pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); - } - } - if (eTypeOwn != NoPresent && eTypeOwn != eTypePersist && eTypeOwn != eTypeMaster) - { - int nIndexType = (int)eTypeOwn; - if (0 <= nIndexType && nIndexType < 9) - { - if (pThemeWrapper->m_pStyles[nIndexType].is_init()) - pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); - } - } - } - else - { - if (-1 != pShape->m_lPlaceholderType) - { - if (NULL != pElementLayoutPH) - { - pTextSettings->m_oLayoutStyles = pElementLayoutPH->m_pShape->m_oText.m_oStyles; - pTextSettings->m_lTextType = pElementLayoutPH->m_pShape->m_oText.m_lTextType; - pTextSettings->m_lStyleThemeIndex = pElementLayoutPH->m_pShape->m_oText.m_lStyleThemeIndex; - } - else - { - switch (oElemInfo.m_lMasterPlaceholderType) - { - case PT_Title: - case PT_MasterTitle: - case PT_VerticalTitle: - { - pTextSettings->m_lStyleThemeIndex = 1; - break; - } - case PT_CenterTitle: - case PT_MasterCenterTitle: - { - pTextSettings->m_lStyleThemeIndex = 1; - break; - } - case PT_Body: - case PT_MasterBody: - case PT_NotesBody: - case PT_MasterNotesBody: - case PT_VerticalBody: - { - pTextSettings->m_lStyleThemeIndex = 2; - break; - } - default: - { - pTextSettings->m_lStyleThemeIndex = 3; - break; - } - } - } - } - else - { - pTextSettings->m_lStyleThemeIndex = -1; - } + // теперь смотрим все остальные стили (persist и own) - просто применяем их к m_oStyles + if (eTypePersist != NoPresent && eTypePersist != eTypeMaster) + { + int nIndexType = (int)eTypePersist; + if (0 <= nIndexType && nIndexType < 9) + { + if (pThemeWrapper->m_pStyles[nIndexType].is_init()) + pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); + } + } + if (eTypeOwn != NoPresent && eTypeOwn != eTypePersist && eTypeOwn != eTypeMaster) + { + int nIndexType = (int)eTypeOwn; + if (0 <= nIndexType && nIndexType < 9) + { + if (pThemeWrapper->m_pStyles[nIndexType].is_init()) + pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); + } + } + } + else + { + if (-1 != pShape->m_lPlaceholderType) + { + if (NULL != pElementLayoutPH) + { + pTextSettings->m_oLayoutStyles = pElementLayoutPH->m_pShape->m_oText.m_oStyles; + pTextSettings->m_lTextType = pElementLayoutPH->m_pShape->m_oText.m_lTextType; + pTextSettings->m_lStyleThemeIndex = pElementLayoutPH->m_pShape->m_oText.m_lStyleThemeIndex; + } + else + { + switch (oElemInfo.m_lMasterPlaceholderType) + { + case PT_Title: + case PT_MasterTitle: + case PT_VerticalTitle: + { + pTextSettings->m_lStyleThemeIndex = 1; + break; + } + case PT_CenterTitle: + case PT_MasterCenterTitle: + { + pTextSettings->m_lStyleThemeIndex = 1; + break; + } + case PT_Body: + case PT_MasterBody: + case PT_NotesBody: + case PT_MasterNotesBody: + case PT_VerticalBody: + { + pTextSettings->m_lStyleThemeIndex = 2; + break; + } + default: + { + pTextSettings->m_lStyleThemeIndex = 3; + break; + } + } + } + } + else + { + pTextSettings->m_lStyleThemeIndex = -1; + } - // теперь смотрим все остальные стили (persist и own) - просто применяем их к m_oStyles - if (eTypePersist != NoPresent && eTypePersist != eTypeMaster) - { - int nIndexType = (int)eTypePersist; - if (0 <= nIndexType && nIndexType < 9) - { - if (pThemeWrapper->m_pStyles[nIndexType].is_init()) - pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); - } - } - if (eTypeOwn != NoPresent && eTypeOwn != Tx_TYPE_OTHER && eTypeOwn != eTypePersist && eTypeOwn != eTypeMaster) - {//齐孟尧-2015年度职工考核报告.ppt - int nIndexType = (int)eTypeOwn; - - if (0 <= nIndexType && nIndexType < 9 && pLayout) - { - if (eTypeOwn == Tx_TYPE_HALFBODY || eTypeOwn == Tx_TYPE_QUARTERBODY) - { - if (pThemeWrapper->m_pStyles[1].IsInit())//body -> (560).ppt - { - pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[1].get()); - } - } - if (pThemeWrapper->m_pStyles[nIndexType].IsInit()) - { - pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); - } - } - } - } + // теперь смотрим все остальные стили (persist и own) - просто применяем их к m_oStyles + if (eTypePersist != NoPresent && eTypePersist != eTypeMaster) + { + int nIndexType = (int)eTypePersist; + if (0 <= nIndexType && nIndexType < 9) + { + if (pThemeWrapper->m_pStyles[nIndexType].is_init()) + pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); + } + } + if (eTypeOwn != NoPresent && eTypeOwn != Tx_TYPE_OTHER && eTypeOwn != eTypePersist && eTypeOwn != eTypeMaster) + {//齐孟尧-2015年度职工考核报告.ppt + int nIndexType = (int)eTypeOwn; - if ((_T("") != strText) && 0 == pTextSettings->m_arParagraphs.size()) - { - // значит никаких своих настроек нету. Значит просто пустые свои настройки - std::vector oArrayPF; - - CTextPFRunRecord elm; - - elm.m_lCount = strText.length(); - elm.m_lLevel = 0; - - oArrayPF.push_back(elm); + if (0 <= nIndexType && nIndexType < 9 && pLayout) + { + if (eTypeOwn == Tx_TYPE_HALFBODY || eTypeOwn == Tx_TYPE_QUARTERBODY) + { + if (pThemeWrapper->m_pStyles[1].IsInit())//body -> (560).ppt + { + pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[1].get()); + } + } + if (pThemeWrapper->m_pStyles[nIndexType].IsInit()) + { + pTextSettings->m_oStyles.ApplyAfter(pThemeWrapper->m_pStyles[nIndexType].get()); + } + } + } + } - std::vector oArrayCF; - - CTextCFRunRecord elm1; - elm1.m_lCount = elm.m_lCount; - - oArrayCF.push_back(elm1); - - PPT_FORMAT::ConvertPPTTextToEditorStructure(oArrayPF, oArrayCF, strText, *pTextSettings); - } + if ((_T("") != strText) && 0 == pTextSettings->m_arParagraphs.size()) + { + // значит никаких своих настроек нету. Значит просто пустые свои настройки + std::vector oArrayPF; - if (NULL != oElemInfo.m_pStream && -1 != oElemInfo.m_lOffsetTextProp) - { - //языковые настройки текта - LONG lPosition = 0; StreamUtils::StreamPosition(lPosition, oElemInfo.m_pStream); + CTextPFRunRecord elm; - StreamUtils::StreamSeek(oElemInfo.m_lOffsetTextProp - 8, oElemInfo.m_pStream); + elm.m_lCount = strText.length(); + elm.m_lLevel = 0; - SRecordHeader oHeader; - oHeader.ReadFromStream(oElemInfo.m_pStream) ; + oArrayPF.push_back(elm); + + std::vector oArrayCF; + + CTextCFRunRecord elm1; + elm1.m_lCount = elm.m_lCount; + + oArrayCF.push_back(elm1); + + PPT_FORMAT::ConvertPPTTextToEditorStructure(oArrayPF, oArrayCF, strText, *pTextSettings); + } + + if (NULL != oElemInfo.m_pStream && -1 != oElemInfo.m_lOffsetTextProp) + { + //языковые настройки текта + LONG lPosition = 0; StreamUtils::StreamPosition(lPosition, oElemInfo.m_pStream); + + StreamUtils::StreamSeek(oElemInfo.m_lOffsetTextProp - 8, oElemInfo.m_pStream); + + SRecordHeader oHeader; + oHeader.ReadFromStream(oElemInfo.m_pStream) ; if (RT_TextSpecialInfoAtom == oHeader.RecType) - { - CRecordTextSpecInfoAtom* pSpecInfo = new CRecordTextSpecInfoAtom(); - pSpecInfo->m_lCount = -1; + { + CRecordTextSpecInfoAtom* pSpecInfo = new CRecordTextSpecInfoAtom(); + pSpecInfo->m_lCount = -1; - pSpecInfo->ReadFromStream(oHeader, oElemInfo.m_pStream); - pSpecInfo->ApplyProperties(&(pShape->m_pShape->m_oText)); + pSpecInfo->ReadFromStream(oHeader, oElemInfo.m_pStream); + pSpecInfo->ApplyProperties(&(pShape->m_pShape->m_oText)); - RELEASEOBJECT(pSpecInfo); - } - StreamUtils::StreamSeek(lPosition, oElemInfo.m_pStream); - } - pShape->m_pShape->m_oText.RecalcParagraphsPPT(); - - ApplyThemeStyle(pElem, pTheme, master_levels); + RELEASEOBJECT(pSpecInfo); + } + StreamUtils::StreamSeek(lPosition, oElemInfo.m_pStream); + } + pShape->m_pShape->m_oText.RecalcParagraphsPPT(); - if (pShape->m_oTextActions.m_bPresent) - { - //todooo разобраться нужно ли менять цвет на гиперлинк - 1-(34).ppt - ODRAW::CColor oColor; - if ((NULL != pSlide) && !pSlide->m_bUseLayoutColorScheme) oColor = pSlide->GetColor(11); - else if ((NULL != pLayout) && (!pLayout->m_bUseThemeColorScheme)) oColor = pLayout->GetColor(11); - else if (NULL != pTheme) oColor = pTheme->GetColor(11); - oColor.m_lSchemeIndex = 11; + ApplyThemeStyle(pElem, pTheme, master_levels); - ApplyHyperlink(pShape, oColor); - } + if (pShape->m_oTextActions.m_bPresent) + { + //todooo разобраться нужно ли менять цвет на гиперлинк - 1-(34).ppt + ODRAW::CColor oColor; + if ((NULL != pSlide) && !pSlide->m_bUseLayoutColorScheme) oColor = pSlide->GetColor(11); + else if ((NULL != pLayout) && (!pLayout->m_bUseThemeColorScheme)) oColor = pLayout->GetColor(11); + else if (NULL != pTheme) oColor = pTheme->GetColor(11); + oColor.m_lSchemeIndex = 11; - CPPTShape* pPPTShape = dynamic_cast(pShape->m_pShape->getBaseShape().get()); + ApplyHyperlink(pShape, oColor); + } - if (NULL != pPPTShape) // проверка на wordart - { - switch (pPPTShape->m_eType) - { - case sptTextPlainText: - case sptTextStop: - case sptTextTriangle: - case sptTextTriangleInverted: - case sptTextChevron: - case sptTextChevronInverted: - case sptTextRingInside: - case sptTextRingOutside: - case sptTextArchUpCurve: - case sptTextArchDownCurve: - case sptTextCircleCurve: - case sptTextButtonCurve: - case sptTextArchUpPour: - case sptTextArchDownPour: - case sptTextCirclePour: - case sptTextButtonPour: - case sptTextCurveUp: - case sptTextCurveDown: - case sptTextCascadeUp: - case sptTextCascadeDown: - case sptTextWave1: - case sptTextWave2: - case sptTextWave3: - case sptTextWave4: - case sptTextInflate: - case sptTextDeflate: - case sptTextInflateBottom: - case sptTextDeflateBottom: - case sptTextInflateTop: - case sptTextDeflateTop: - case sptTextDeflateInflate: - case sptTextDeflateInflateDeflate: - case sptTextFadeRight: - case sptTextFadeLeft: - case sptTextFadeUp: - case sptTextFadeDown: - case sptTextSlantUp: - case sptTextSlantDown: - case sptTextCanUp: - case sptTextCanDown: - { - pShape->m_pShape->m_oText.m_oAttributes.m_oTextBrush = pShape->m_oBrush; + CPPTShape* pPPTShape = dynamic_cast(pShape->m_pShape->getBaseShape().get()); - pShape->m_pShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; - pShape->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical = 1; + if (NULL != pPPTShape) // проверка на wordart + { + switch (pPPTShape->m_eType) + { + case sptTextPlainText: + case sptTextStop: + case sptTextTriangle: + case sptTextTriangleInverted: + case sptTextChevron: + case sptTextChevronInverted: + case sptTextRingInside: + case sptTextRingOutside: + case sptTextArchUpCurve: + case sptTextArchDownCurve: + case sptTextCircleCurve: + case sptTextButtonCurve: + case sptTextArchUpPour: + case sptTextArchDownPour: + case sptTextCirclePour: + case sptTextButtonPour: + case sptTextCurveUp: + case sptTextCurveDown: + case sptTextCascadeUp: + case sptTextCascadeDown: + case sptTextWave1: + case sptTextWave2: + case sptTextWave3: + case sptTextWave4: + case sptTextInflate: + case sptTextDeflate: + case sptTextInflateBottom: + case sptTextDeflateBottom: + case sptTextInflateTop: + case sptTextDeflateTop: + case sptTextDeflateInflate: + case sptTextDeflateInflateDeflate: + case sptTextFadeRight: + case sptTextFadeLeft: + case sptTextFadeUp: + case sptTextFadeDown: + case sptTextSlantUp: + case sptTextSlantDown: + case sptTextCanUp: + case sptTextCanDown: + { + pShape->m_pShape->m_oText.m_oAttributes.m_oTextBrush = pShape->m_oBrush; - pShape->m_pShape->m_lDrawType = c_ShapeDrawType_Text; - break; - } - default: - break; - }; - } + pShape->m_pShape->m_oText.m_oAttributes.m_nTextAlignHorizontal = 1; + pShape->m_pShape->m_oText.m_oAttributes.m_nTextAlignVertical = 1; + + pShape->m_pShape->m_lDrawType = c_ShapeDrawType_Text; + break; + } + default: + break; + }; + } } void CRecordShapeContainer::ApplyHyperlink(CShapeElement* pShape, CColor& oColor) { - std::vector* pRanges = &pShape->m_oTextActions.m_arRanges; - CTextAttributesEx* pTextAttributes = &pShape->m_pShape->m_oText; + auto& oTextAttributes = pShape->m_pShape->m_oText; + const auto& originalText = oTextAttributes.m_originalText; - int lCountHyper = pRanges->size(); + // lenght these ones shoud be equal + const auto& arrRanges = pShape->m_oTextActions.m_arRanges; + const auto arrSplitedInteractive = splitInteractive(pShape->m_textHyperlinks); - if (0 == lCountHyper) - return; + // It cannot be changed + if (arrRanges.empty() || arrSplitedInteractive.empty()) + return; - size_t nCountPars = pTextAttributes->m_arParagraphs.size(); - for (int nIndexRange = 0; nIndexRange < lCountHyper; ++nIndexRange) - { - int lStart = (*pRanges)[nIndexRange].m_lStart; - int lEnd = (*pRanges)[nIndexRange].m_lEnd; + size_t posOrigText(0); + auto iterRange = arrRanges.begin(); + auto iterInteractive = arrSplitedInteractive.begin(); + for (auto& paragraph : oTextAttributes.m_arParagraphs) + { + auto& arrSpans = paragraph.m_arSpans; + for (auto iterSpan = arrSpans.begin(); iterSpan != arrSpans.end(); iterSpan++) + { + // if there isn't needed changes in next spans & paragraps + if (iterRange == arrRanges.end()) + { + return; + } - int lCurrentStart = 0; - for (size_t nIndexPar = 0; nIndexPar < nCountPars; ++nIndexPar) - { - CParagraph* pParagraph = &pTextAttributes->m_arParagraphs[nIndexPar]; + const bool isHyperlink = iterRange->inRange(posOrigText); - for (size_t nIndexSpan = 0; nIndexSpan < pParagraph->m_arSpans.size(); ++nIndexSpan) - { - int lCurrentEnd = lCurrentStart + pParagraph->m_arSpans[nIndexSpan].m_strText.length() - 1; + const int posBlockStart = posOrigText; + const int posOrigSpanEnd = posBlockStart + iterSpan->m_strText.length(); + const int posBlockEnd = isHyperlink ? + std::min(posOrigSpanEnd, iterRange->m_lEnd) : + std::min(posOrigSpanEnd, iterRange->m_lStart); + const size_t blockLen = posBlockEnd - posBlockStart; - if (lCurrentStart > lEnd || lCurrentEnd < lStart) - { - lCurrentStart = lCurrentEnd + 1; - continue; - } + const bool isNeedToSplit = posBlockEnd < posOrigSpanEnd && isHyperlink; - int lStart_ = (std::max)(lStart, lCurrentStart); - int lEnd_ = (std::min)(lEnd, lCurrentEnd); + posOrigText += blockLen; + // Skipping span + if (iterRange->m_lStart > posBlockEnd) + { + continue; + } - CSpan oRunProp = pParagraph->m_arSpans[nIndexSpan]; + // HYPERLINK + if (isHyperlink) + { + // case: HYPERLINK & text(or next HYPERLINK inside original span) + if (isNeedToSplit) + { + // HYPERLINK + iterSpan->m_strText = originalText.substr(posBlockStart, blockLen); - std::wstring strText = pParagraph->m_arSpans[nIndexSpan].m_strText; - if (lStart_ > lCurrentStart) - { - pParagraph->m_arSpans.insert(pParagraph->m_arSpans.begin() + nIndexSpan, oRunProp); - pParagraph->m_arSpans[nIndexSpan].m_strText = strText.substr(0, lStart_ - lCurrentStart); + const size_t nextBlockLen = posOrigSpanEnd - posBlockEnd; + iterSpan = arrSpans.insert(iterSpan, *iterSpan); + // Go to next new span and correct text + iterSpan++; + iterSpan->m_strText = originalText.substr(posBlockEnd, nextBlockLen); + iterSpan->m_arrInteractive.clear(); + // Return to current span + iterSpan--; + } - ++nIndexSpan; - } - pParagraph->m_arSpans[nIndexSpan].m_oRun.Color = oColor; - pParagraph->m_arSpans[nIndexSpan].m_oRun.FontUnderline = (bool)true; - pParagraph->m_arSpans[nIndexSpan].m_strText = strText.substr(lStart_ - lCurrentStart, lEnd_ - lStart_ + 1); - if (lEnd_ < lCurrentEnd) - { - pParagraph->m_arSpans.insert(pParagraph->m_arSpans.begin() + nIndexSpan + 1, oRunProp); - ++nIndexSpan; + addHyperlinkToSpan(*iterSpan, *iterInteractive, oColor); - pParagraph->m_arSpans[nIndexSpan].m_strText = strText.substr(lEnd_ - lCurrentStart + 1, lCurrentEnd - lEnd_); - } + if (posBlockEnd == iterRange->m_lEnd) + { + iterRange++; + iterInteractive++; + } + } + // Hyperlink will be written in the next iteration + // case: text & HYPERLINK + else + { + iterSpan = arrSpans.insert(iterSpan, *iterSpan); + iterSpan->m_strText = originalText.substr(posBlockStart, blockLen); + iterSpan->m_arrInteractive.clear(); - lCurrentStart = lCurrentEnd + 1; - } - } - } -} + // Go to next new span and correct text + iterSpan++; + const size_t nextBlockLen = posOrigSpanEnd - posBlockEnd; + iterSpan->m_strText = originalText.substr(posBlockEnd, nextBlockLen); + iterSpan->m_arrInteractive.clear(); + // Return to current span + iterSpan--; + } + } + // skipping '\r' + posOrigText++; + } +} + +void CRecordShapeContainer::addHyperlinkToSpan(CSpan &oSpan, const std::vector &arrInteractive, const CColor &oColor) +{ + oSpan.m_oRun.Color = oColor; + oSpan.m_oRun.FontUnderline = (bool)true; + oSpan.m_arrInteractive = arrInteractive; +} + +std::vector > CRecordShapeContainer::splitInteractive(const std::vector &arrInteractive) +{ + std::vector > splited; + std::vector inserting; + for (const auto& interactive : arrInteractive) + { + if (interactive.m_eActivation == interactive.click && !inserting.empty()) + splited.push_back(std::move(inserting)); + inserting.push_back(interactive); + } + if (!inserting.empty()) + splited.push_back(std::move(inserting)); + + return splited; +} + +void CRecordShapeContainer::ConvertInteractiveInfo(CInteractiveInfo &interactiveInfo, const CRecordMouseInteractiveInfoContainer *interactiveCont, CExMedia *pMapIDs) +{ + + auto& interactiveAtom = interactiveCont->interactiveInfoAtom; + interactiveInfo.m_bPresent = true; + interactiveInfo.m_eActivation = interactiveCont->isOver; + + if (pMapIDs) + { + CExFilesInfo* pInfo1 = pMapIDs->LockAudioFromCollection(interactiveAtom.m_nSoundIdRef); + if (NULL != pInfo1) + { + interactiveInfo.m_strAudioFileName = pInfo1->m_strFilePath; + interactiveInfo.m_strAudioName = pInfo1->m_name; + } + CExFilesInfo* pInfo2 = pMapIDs->LockSlide(interactiveAtom.m_nExHyperlinkIdRef); + if (NULL != pInfo2) + { + interactiveInfo.m_strHyperlink = pInfo2->m_strFilePath; + } else { + pInfo2 = pMapIDs->LockHyperlink(interactiveAtom.m_nExHyperlinkIdRef); + if (NULL != pInfo2) + { + interactiveInfo.m_strHyperlink = pInfo2->m_strFilePath; + } + } + } + if (interactiveCont->macroNameAtom.is_init()) + interactiveInfo.m_macro = interactiveCont->macroNameAtom->m_strText; + + interactiveInfo.m_lType = interactiveAtom.m_nAction; + interactiveInfo.m_lOleVerb = interactiveAtom.m_nOleVerb; + interactiveInfo.m_lJump = interactiveAtom.m_nJump; + interactiveInfo.m_lHyperlinkType = interactiveAtom.m_nHyperlinkType; + + interactiveInfo.m_bAnimated = interactiveAtom.m_bAnimated; + interactiveInfo.m_bStopSound = interactiveAtom.m_bStopSound; + interactiveInfo.m_bCustomShowReturn = interactiveAtom.m_bCustomShowReturn; + interactiveInfo.m_bVisited = interactiveAtom.m_bVisited; + +} void CRecordGroupShapeContainer::ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) { - CRecordsContainer::ReadFromStream(oHeader, pStream); + CRecordsContainer::ReadFromStream(oHeader, pStream); } diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.h b/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.h index a737f0eaf0..f4c8d48081 100755 --- a/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ShapeContainer.h @@ -41,7 +41,7 @@ #include "../PlaceHolderAtom.h" #include "../StyleTextPropAtom.h" #include "../OutlineTextRefAtom.h" -#include "../InteractiveInfoAtom.h" +#include "../MouseInteractiveInfoContainer.h" #include "../TextInteractiveInfoAtom.h" #include "../MasterTextPropAtom.h" #include "../HeadersFootersAtom.h" @@ -55,6 +55,7 @@ #include "../../../../DesktopEditor/raster/BgraFrame.h" #include "../../../../Common/DocxFormat/Source/Base/Types_32.h" + #define FIXED_POINT_unsigned(val) (double)((WORD)(val >> 16) + ((WORD)(val) / 65536.0)) using namespace ODRAW; @@ -140,7 +141,14 @@ public: protected: + bool isTable()const; + std::wstring getTableXmlStr()const; void ApplyThemeStyle(CElementPtr pElem, CTheme* pTheme, CRecordMasterTextPropAtom* master_levels); void SetUpTextStyle(std::wstring& strText, CTheme* pTheme, CLayout* pLayout, CElementPtr pElem, CSlideInfo* pThemeWrapper, CSlideInfo* pSlideWrapper, CSlide* pSlide, CRecordMasterTextPropAtom* master_levels); void ApplyHyperlink(CShapeElement* pShape, CColor& oColor); + static void addHyperlinkToSpan(CSpan& oSpan, const std::vector &arrInteractive, const CColor& oColor); + static std::vector > splitInteractive(const std::vector& arrInteractive); + static void ConvertInteractiveInfo(CInteractiveInfo& interactiveInfo, const CRecordMouseInteractiveInfoContainer* interactiveCont, CExMedia* pMapIDs); + }; + diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/ExHyperlinkAtom.h b/ASCOfficePPTFile/PPTFormatLib/Records/ExHyperlinkAtom.h index 1eed696c3f..5db31e9052 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/ExHyperlinkAtom.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/ExHyperlinkAtom.h @@ -31,41 +31,82 @@ */ #pragma once #include "../Reader/Records.h" +#include "CString.h" -class CRecordExHyperlinkContainer : public CRecordsContainer -{ -public: - CRecordExHyperlinkContainer() - { - } - ~CRecordExHyperlinkContainer() - { - } - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) - { - CRecordsContainer::ReadFromStream(oHeader, pStream); - } -}; class CRecordExHyperlinkAtom : public CUnknownRecord { public: - UINT m_nHyperlinkID; - - CRecordExHyperlinkAtom() - { - } + UINT m_nHyperlinkID; - ~CRecordExHyperlinkAtom() - { - } + CRecordExHyperlinkAtom() + { + } - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) - { - m_oHeader = oHeader; + ~CRecordExHyperlinkAtom() + { + } - m_nHyperlinkID = StreamUtils::ReadDWORD(pStream); - } -}; \ No newline at end of file + virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) + { + m_oHeader = oHeader; + + m_nHyperlinkID = StreamUtils::ReadDWORD(pStream); + } +}; + +class CRecordExHyperlinkContainer : public CRecordsContainer +{ +public: + CRecordExHyperlinkAtom m_exHyperlinkAtom; + nullable m_friendlyNameAtom; + nullable m_targetAtom; + nullable m_locationAtom; + + CRecordExHyperlinkContainer() + { + } + + ~CRecordExHyperlinkContainer() + { + } + + bool hasCString()const + { + return m_friendlyNameAtom.IsInit() || m_targetAtom.IsInit() || m_locationAtom.IsInit(); + } + + virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) + { + m_oHeader = oHeader; + + SRecordHeader header; + + header.ReadFromStream(pStream); + m_exHyperlinkAtom.ReadFromStream(header, pStream); + + unsigned currentLen = 12; // 12(atom) + while (currentLen < m_oHeader.RecLen) + { + header.ReadFromStream(pStream); + auto* pCString = new CRecordCString; + pCString->ReadFromStream(header, pStream); + switch (header.RecInstance) + { + case 0: m_friendlyNameAtom = pCString; break; + case 1: m_targetAtom = pCString; break; + case 3: m_locationAtom = pCString; break; + default: delete pCString; + } + currentLen += 8 + header.RecLen; // headerLen + CStringLen + } +// if (m_friendlyNameAtom.IsInit() && (int)m_friendlyNameAtom->m_strText.find(L"NEXT") == -1) +// std::wcout << m_exHyperlinkAtom.m_nHyperlinkID << L" " +// << (m_friendlyNameAtom.IsInit() ? m_friendlyNameAtom->m_strText : L"-") << L" " +// << (m_targetAtom.IsInit() ? m_targetAtom->m_strText : L"-") << L" " +// << (m_locationAtom.IsInit() ? m_locationAtom->m_strText : L"-") +// << std::endl; + } +}; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/InteractiveInfoAtom.h b/ASCOfficePPTFile/PPTFormatLib/Records/InteractiveInfoAtom.h index 6762f6f828..6683558f7c 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/InteractiveInfoAtom.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/InteractiveInfoAtom.h @@ -31,48 +31,52 @@ */ #pragma once #include "../Reader/Records.h" +#include class CRecordInteractiveInfoAtom : public CUnknownRecord { public: - UINT m_nSoundIdRef; - UINT m_nExHyperlinkIdRef; - BYTE m_nAction; - BYTE m_nOleVerb; - BYTE m_nJump; - BYTE m_nHyperlinkType; + UINT m_nSoundIdRef; + UINT m_nExHyperlinkIdRef; + BYTE m_nAction; + BYTE m_nOleVerb; + BYTE m_nJump; + BYTE m_nHyperlinkType; - bool m_bAnimated; - bool m_bStopSound; - bool m_bCustomShowReturn; - bool m_bVisited; - - CRecordInteractiveInfoAtom() - { - } + bool m_bAnimated; + bool m_bStopSound; + bool m_bCustomShowReturn; + bool m_bVisited; - ~CRecordInteractiveInfoAtom() - { - } + CRecordInteractiveInfoAtom() + { + } - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) - { - m_oHeader = oHeader; + ~CRecordInteractiveInfoAtom() + { + } - m_nSoundIdRef = StreamUtils::ReadDWORD(pStream); - m_nExHyperlinkIdRef = StreamUtils::ReadDWORD(pStream); - m_nAction = StreamUtils::ReadBYTE(pStream); - m_nOleVerb = StreamUtils::ReadBYTE(pStream); - m_nJump = StreamUtils::ReadBYTE(pStream); + virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) + { + m_oHeader = oHeader; - BYTE nFlag = StreamUtils::ReadBYTE(pStream); + m_nSoundIdRef = StreamUtils::ReadDWORD(pStream); + m_nExHyperlinkIdRef = StreamUtils::ReadDWORD(pStream); + m_nAction = StreamUtils::ReadBYTE(pStream); + m_nOleVerb = StreamUtils::ReadBYTE(pStream); + m_nJump = StreamUtils::ReadBYTE(pStream); - m_bAnimated = ((nFlag & 0x01) == 0x01); - m_bStopSound = ((nFlag & 0x02) == 0x02); - m_bCustomShowReturn = ((nFlag & 0x04) == 0x04); - m_bVisited = ((nFlag & 0x08) == 0x08); + BYTE nFlag = StreamUtils::ReadBYTE(pStream); - m_nHyperlinkType = StreamUtils::ReadBYTE(pStream); - StreamUtils::StreamSkip(3, pStream); - } -}; \ No newline at end of file + m_bAnimated = ((nFlag & 0x01) == 0x01); + m_bStopSound = ((nFlag & 0x02) == 0x02); + m_bCustomShowReturn = ((nFlag & 0x04) == 0x04); + m_bVisited = ((nFlag & 0x08) == 0x08); + + m_nHyperlinkType = StreamUtils::ReadBYTE(pStream); + StreamUtils::StreamSkip(3, pStream); +// if (m_nExHyperlinkIdRef) +// std::wcout << L"HyperlinkIDRef: " << m_nExHyperlinkIdRef << std::endl;; + + } +}; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/MetafileBlob.h b/ASCOfficePPTFile/PPTFormatLib/Records/MetafileBlob.h index 548e47acb1..4f0db277f6 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/MetafileBlob.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/MetafileBlob.h @@ -31,6 +31,8 @@ */ #pragma once #include "../Reader/Records.h" +#include + class CRecordMetafileBlob : public CUnknownRecord { @@ -40,17 +42,26 @@ public: SHORT m_nExtY; BYTE* m_pData; - CRecordMetafileBlob() + CRecordMetafileBlob() : + m_nMM(-1), m_nExtX(-1), m_nExtY(-1), m_pData(nullptr) { + } ~CRecordMetafileBlob() { + RELEASEOBJECT (m_pData) } virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) { - return CUnknownRecord::ReadFromStream(oHeader, pStream); + m_oHeader = oHeader; + + m_nMM = StreamUtils::ReadSHORT(pStream); + m_nExtX = StreamUtils::ReadSHORT(pStream); + m_nExtY = StreamUtils::ReadSHORT(pStream); + pStream->read(m_pData, m_oHeader.RecLen - 6); + std::cout << m_pData << "\n\n"; } -}; \ No newline at end of file +}; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/MouseInteractiveInfoContainer.h b/ASCOfficePPTFile/PPTFormatLib/Records/MouseInteractiveInfoContainer.h new file mode 100644 index 0000000000..c20fd2d88b --- /dev/null +++ b/ASCOfficePPTFile/PPTFormatLib/Records/MouseInteractiveInfoContainer.h @@ -0,0 +1,68 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2019 + * + * 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 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * 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 + * + */ +#pragma once +#include "InteractiveInfoAtom.h" +#include "CString.h" + +class CRecordMouseInteractiveInfoContainer : public CUnknownRecord +{ +public: + CRecordInteractiveInfoAtom interactiveInfoAtom; + nullable macroNameAtom; + bool isOver; // click = 0, over = 1 + + CRecordMouseInteractiveInfoContainer() : + isOver(false) + { + } + + ~CRecordMouseInteractiveInfoContainer() + { + } + + virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) + { + m_oHeader = oHeader; + isOver = oHeader.RecInstance; + + SRecordHeader header; + header.ReadFromStream(pStream); + interactiveInfoAtom.ReadFromStream(header, pStream); + + if (m_oHeader.RecLen > 24) + { + header.ReadFromStream(pStream); + macroNameAtom.reset(new CRecordCString); + macroNameAtom->ReadFromStream(header, pStream); + } + } +}; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/OfficeArtClientData.h b/ASCOfficePPTFile/PPTFormatLib/Records/OfficeArtClientData.h index 6884fe8e58..62efbc2752 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/OfficeArtClientData.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/OfficeArtClientData.h @@ -100,6 +100,12 @@ public: m_rgShapeClientRoundtripData.push_back(pRec); break; } + case RT_VbaInfo: + { + auto pRec = new CRecordsContainer; + pRec->ReadFromStream(ReadHeader, pStream); + break; + } default: IRecord* pRecord = CreateByType(ReadHeader); pRecord->ReadFromStream(ReadHeader, pStream); diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/RecordsIncluder.h b/ASCOfficePPTFile/PPTFormatLib/Records/RecordsIncluder.h index 0e72ead75a..0afb3f0b18 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/RecordsIncluder.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/RecordsIncluder.h @@ -57,6 +57,7 @@ #include "Drawing/DrawingContainer.h" #include "OfficeArtClientData.h" +#include "OfficeArtClientTextbox.h" // others @@ -128,6 +129,7 @@ #include "Animations/_includer.h" #include "InteractiveInfoAtom.h" #include "TextInteractiveInfoAtom.h" +#include "MouseInteractiveInfoContainer.h" //sound #include "ExMIDIAudioContainer.h" @@ -141,3 +143,6 @@ #include "RoundTripOriginalMainMasterId12Atom.h" #include "RoundTripCompositeMainMasterId12Atom.h" + +// Meta data +#include "RoundTripOArtTextStyles12Atom.h" diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/RoundTripOArtTextStyles12Atom.h b/ASCOfficePPTFile/PPTFormatLib/Records/RoundTripOArtTextStyles12Atom.h new file mode 100644 index 0000000000..a0994ed8ad --- /dev/null +++ b/ASCOfficePPTFile/PPTFormatLib/Records/RoundTripOArtTextStyles12Atom.h @@ -0,0 +1,68 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2019 + * + * 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 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * 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 + * + */ +#pragma once +#include "../Reader/Records.h" +#include + +class CRecordRoundTripOArtTextStyles12Atom : public CUnknownRecord +{ + BYTE* m_pData; + +public: + + CRecordRoundTripOArtTextStyles12Atom() + { + m_pData = NULL; + } + + ~CRecordRoundTripOArtTextStyles12Atom() + { + ReleaseData(); + } + + virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) + { + m_oHeader = oHeader; + unsigned lSize = m_oHeader.RecLen; + + if (0 < lSize) + { + m_pData = new BYTE[lSize]; + pStream->read(m_pData, lSize); + } + } + + void ReleaseData() + { + RELEASEARRAYOBJECTS(m_pData); + } +}; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/RoundTripThemeAtom.h b/ASCOfficePPTFile/PPTFormatLib/Records/RoundTripThemeAtom.h index 34abab6fea..9134d872a0 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/RoundTripThemeAtom.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/RoundTripThemeAtom.h @@ -32,19 +32,23 @@ #pragma once #include "../Reader/Records.h" +#include + +//ULONG ThemeCounter = 1; + class CRecordRoundTripThemeAtom : public CUnknownRecord { public: - std::pair, _INT32> data; - - CRecordRoundTripThemeAtom(){} - ~CRecordRoundTripThemeAtom(){} + std::pair, _INT32> data; - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) - { - m_oHeader = oHeader; - - data = std::make_pair(boost::shared_array(new unsigned char[m_oHeader.RecLen]), m_oHeader.RecLen); - pStream->read(data.first.get(), data.second); - } + CRecordRoundTripThemeAtom(){} + ~CRecordRoundTripThemeAtom(){} + + virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) + { + m_oHeader = oHeader; + + data = std::make_pair(boost::shared_array(new unsigned char[m_oHeader.RecLen]), m_oHeader.RecLen); + pStream->read(data.first.get(), data.second); + } }; diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/SlideContainer.h b/ASCOfficePPTFile/PPTFormatLib/Records/SlideContainer.h index 0e0bd8d52e..84ba071894 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/SlideContainer.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/SlideContainer.h @@ -32,6 +32,7 @@ #pragma once #include "../Reader/Records.h" #include "SlideProgTagsContainer.h" +#include "VBAInfoAtom.h" #include "../Records/SSSlideInfoAtom.h" @@ -110,6 +111,16 @@ public: continue; } + if (RT_VbaInfo == oRec.RecType) + { + auto pVbaInfo = new CRecordsContainer; + pVbaInfo->ReadFromStream(oRec, pStream); + m_arRecords.push_back(pVbaInfo); + + lCurLen += (8 + oRec.RecLen); + continue; + } + IRecord* pRecord = CreateByType ( oRec ); diff --git a/ASCOfficePPTFile/PPTFormatLib/Records/VBAInfoAtom.h b/ASCOfficePPTFile/PPTFormatLib/Records/VBAInfoAtom.h index 82f0930d36..dd540afcc2 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Records/VBAInfoAtom.h +++ b/ASCOfficePPTFile/PPTFormatLib/Records/VBAInfoAtom.h @@ -59,6 +59,20 @@ public: }; +class CRecordVBAInfoContainer : public CRecordsContainer +{ +public: + CRecordVBAInfoContainer() + {} + ~CRecordVBAInfoContainer() + {} + virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) + { + m_oHeader = oHeader; + CRecordsContainer::ReadFromStream(oHeader, pStream); + } +}; + class CRecordVbaProjectStg : public CUnknownRecord { public: diff --git a/ASCOfficePPTXFile/Editor/BinReaderWriterDefines.h b/ASCOfficePPTXFile/Editor/BinReaderWriterDefines.h index 9fbca88fb5..254999b7d4 100644 --- a/ASCOfficePPTXFile/Editor/BinReaderWriterDefines.h +++ b/ASCOfficePPTXFile/Editor/BinReaderWriterDefines.h @@ -192,18 +192,22 @@ namespace NSBinPptxRW #define SPTREE_TYPE_OLE 6 #define SPTREE_TYPE_VIDEO 7 #define SPTREE_TYPE_AUDIO 8 -#define SPTREE_TYPE_LOCKED_CANVAS 9 +#define SPTREE_TYPE_LOCKED_CANVAS 9 -#define DIAGRAM_LAYOUT_TYPE_NONE 0xA0 -#define DIAGRAM_LAYOUT_TYPE_ALG 0xA1 -#define DIAGRAM_LAYOUT_TYPE_CHOOSE 0xA2 -#define DIAGRAM_LAYOUT_TYPE_CONSTRLST 0xA3 -#define DIAGRAM_LAYOUT_TYPE_FOREACH 0xA4 -#define DIAGRAM_LAYOUT_TYPE_LAYOUTNODE 0xA5 -#define DIAGRAM_LAYOUT_TYPE_PRESOF 0xA6 -#define DIAGRAM_LAYOUT_TYPE_RULELST 0xA7 -#define DIAGRAM_LAYOUT_TYPE_SHAPE 0xA8 -#define DIAGRAM_LAYOUT_TYPE_VARIABLELIST 0xA9 + +#define DIAGRAM_LAYOUT_TYPE_NONE 0xB0 +#define DIAGRAM_LAYOUT_TYPE_ALG 0xB1 +#define DIAGRAM_LAYOUT_TYPE_CHOOSE 0xB2 +#define DIAGRAM_LAYOUT_TYPE_CONSTRLST 0xB3 +#define DIAGRAM_LAYOUT_TYPE_FOREACH 0xB4 +#define DIAGRAM_LAYOUT_TYPE_LAYOUTNODE 0xB5 +#define DIAGRAM_LAYOUT_TYPE_PRESOF 0xB6 +#define DIAGRAM_LAYOUT_TYPE_RULELST 0xB7 +#define DIAGRAM_LAYOUT_TYPE_SHAPE 0xB8 +#define DIAGRAM_LAYOUT_TYPE_VARIABLELIST 0xB9 + + +#define SPTREE_TYPE_MACRO 0xA1 static BYTE SchemeClr_GetBYTECode(const std::wstring& sValue) diff --git a/ASCOfficePPTXFile/Editor/Drawing/Attributes.h b/ASCOfficePPTXFile/Editor/Drawing/Attributes.h index 3f439dacc3..e1462c2e06 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Attributes.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Attributes.h @@ -66,1094 +66,1136 @@ static void CorrectXmlString(std::wstring & strText) } static inline std::wstring BoolToString(bool bValue) { - return bValue ? L"1" : L"0"; + return bValue ? L"1" : L"0"; } namespace PPT_FORMAT { - class CExFilesInfo +class CExFilesInfo +{ +public: + enum ExFilesType { - public: - enum ExFilesType - { - eftNone = 0, - eftVideo = 1, - eftAudio = 2, - eftHyperlink= 3, - eftObject = 4, - eftSlide // Not used yet - }; - _UINT32 m_dwID; - std::wstring m_strFilePath; - std::wstring m_strLocation; - std::wstring m_name; - - // clip - double m_dStartTime; - double m_dEndTime; - - // loop - bool m_bLoop; - - CExFilesInfo() - { - m_dwID = 0; - m_strFilePath = _T(""); - m_strLocation = _T(""); - - m_dStartTime = 0.0; - m_dEndTime = -1.0; - - m_bLoop = false; - } - CExFilesInfo(const CExFilesInfo& oSrc) - { - *this = oSrc; - } - CExFilesInfo& operator=(const CExFilesInfo& oSrc) - { - m_dwID = oSrc.m_dwID; - m_strFilePath = oSrc.m_strFilePath; - m_strLocation = oSrc.m_strLocation; - m_name = oSrc.m_name; - - m_dStartTime = oSrc.m_dStartTime; - m_dEndTime = oSrc.m_dEndTime; - - m_bLoop = oSrc.m_bLoop; - - return *this; - } + eftNone = 0, + eftVideo = 1, + eftAudio = 2, + eftHyperlink = 3, + eftObject = 4, + eftSlide = 5/*, + eftFile = 6*/ }; - class CExMedia + ExFilesType m_type; + _UINT32 m_dwID; + std::wstring m_strFilePath; + std::wstring m_name; + + // clip + double m_dStartTime; + double m_dEndTime; + + // loop + bool m_bLoop; + + CExFilesInfo() { - public: - std::wstring m_strPresentationDirectory; + m_type = eftNone; + m_dwID = 0; + m_strFilePath = _T(""); - std::vector m_arVideos; - std::vector m_arImages; - std::vector m_arAudios; - std::vector m_arHyperlinks; + m_dStartTime = 0.0; + m_dEndTime = -1.0; - std::vector m_arAudioCollection; + m_bLoop = false; + } + CExFilesInfo(const CExFilesInfo& oSrc) + { + *this = oSrc; + } - void Clear() + static int GetSlideNumber(const std::wstring &str) + { + std::wstring sldHeader = L"Slide "; + int strIter = str.find(sldHeader); + if (strIter != -1) { - m_arVideos.clear(); - m_arImages.clear(); - m_arAudios.clear(); - m_arAudioCollection.clear(); - } + std::wstring sNum(str.begin() + sldHeader.size() + strIter, str.end()); + int num = -1; + try { + num = std::stoi(sNum); + if (num > 0 && num < 256) + return num; + } catch (...) { - CExMedia() : m_arVideos(), m_arImages(), m_arAudios() - { - } - - CExMedia(const CExMedia& oSrc) - { - *this = oSrc; - } - - CExMedia& operator=(const CExMedia& oSrc) - { - m_strPresentationDirectory = oSrc.m_strPresentationDirectory; - - for (size_t i=0; i < oSrc.m_arVideos.size(); i++) - m_arVideos.push_back(oSrc.m_arVideos[i]); - for (size_t i=0; i < oSrc.m_arVideos.size(); i++) - m_arImages.push_back(oSrc.m_arImages[i]); - for (size_t i=0; i < oSrc.m_arVideos.size(); i++) - m_arAudios.push_back(oSrc.m_arAudios[i]); - - return *this; - } - CExFilesInfo* LockHyperlink(_UINT32 dwID) - { - size_t nCount = m_arHyperlinks.size(); - for (size_t i = 0; i < nCount; ++i) - { - if (dwID == m_arHyperlinks[i].m_dwID) - { - return &m_arHyperlinks[i]; - } } - - return NULL; } - CExFilesInfo* LockVideo(_UINT32 dwID) + + return -1; + } + static bool isHTTPLink(const std::wstring &str) + { + int iter1 = str.find(L"http://"); + int iter2 = str.find(L"https://"); + return iter1 != -1 || iter2 != -1; + } + static bool isAudioLink(const std::wstring &str) + { + int iter1 = str.find(L".mp3"); + int iter2 = str.find(L".wav"); + int iter3 = str.find(L".waw"); + return iter1 != -1 || iter2 != -1 || iter3 != -1; + } +}; + +class CExMedia +{ +public: + std::wstring m_strPresentationDirectory; + + std::vector m_arVideos; + std::vector m_arImages; + std::vector m_arAudios; + std::vector m_arHyperlinks; + std::vector m_arSlides; + std::vector m_arFiles; + + std::vector m_arAudioCollection; + + void Clear() + { + m_arVideos.clear(); + m_arImages.clear(); + m_arAudios.clear(); + m_arAudioCollection.clear(); + } + + CExMedia() : m_arVideos(), m_arImages(), m_arAudios() + { + } + + CExMedia(const CExMedia& oSrc) + { + *this = oSrc; + } + + CExMedia& operator=(const CExMedia& oSrc) + { + m_strPresentationDirectory = oSrc.m_strPresentationDirectory; + + for (size_t i=0; i < oSrc.m_arVideos.size(); i++) + m_arVideos.push_back(oSrc.m_arVideos[i]); + for (size_t i=0; i < oSrc.m_arVideos.size(); i++) + m_arImages.push_back(oSrc.m_arImages[i]); + for (size_t i=0; i < oSrc.m_arVideos.size(); i++) + m_arAudios.push_back(oSrc.m_arAudios[i]); + + return *this; + } + CExFilesInfo* LockHyperlink(_UINT32 dwID) + { + size_t nCount = m_arHyperlinks.size(); + for (size_t i = 0; i < nCount; ++i) { - size_t nCount = m_arVideos.size(); - for (size_t i = 0; i < nCount; ++i) + if (dwID == m_arHyperlinks[i].m_dwID) { - if (dwID == m_arVideos[i].m_dwID) - { - return &m_arVideos[i]; - } + return &m_arHyperlinks[i]; } - - return NULL; } - CExFilesInfo* LockImage(_UINT32 dwID) + + return NULL; + } + CExFilesInfo* LockSlide(_UINT32 dwID) + { + size_t nCount = m_arSlides.size(); + for (size_t i = 0; i < nCount; ++i) { - size_t nCount = m_arImages.size(); - for (size_t i = 0; i < nCount; ++i) + if (dwID == m_arSlides[i].m_dwID) { - if (dwID == m_arImages[i].m_dwID) - { - return &m_arImages[i]; - } + return &m_arSlides[i]; } - - return NULL; } - CExFilesInfo* LockAudio(_UINT32 dwID) + + return NULL; + } + CExFilesInfo* LockVideo(_UINT32 dwID) + { + size_t nCount = m_arVideos.size(); + for (size_t i = 0; i < nCount; ++i) { - size_t nCount = m_arAudios.size(); - for (size_t i = 0; i < nCount; ++i) + if (dwID == m_arVideos[i].m_dwID) { - if (dwID == m_arAudios[i].m_dwID) - { - return &m_arAudios[i]; - } + return &m_arVideos[i]; } - - return NULL; } - CExFilesInfo* LockAudioFromCollection(_UINT32 dwID) + + return NULL; + } + CExFilesInfo* LockImage(_UINT32 dwID) + { + size_t nCount = m_arImages.size(); + for (size_t i = 0; i < nCount; ++i) { - size_t nCount = m_arAudioCollection.size(); - for (size_t i = 0; i < nCount; ++i) + if (dwID == m_arImages[i].m_dwID) { - if (dwID == m_arAudioCollection[i].m_dwID) - { - return &m_arAudioCollection[i]; - } + return &m_arImages[i]; } - - return NULL; } - CExFilesInfo* Lock(_UINT32 dwID, CExFilesInfo::ExFilesType& eType) + return NULL; + } + CExFilesInfo* LockAudio(_UINT32 dwID) + { + size_t nCount = m_arAudios.size(); + for (size_t i = 0; i < nCount; ++i) { - CExFilesInfo* pInfo = NULL; - - pInfo = LockHyperlink(dwID); - if (NULL != pInfo) + if (dwID == m_arAudios[i].m_dwID) { - eType = CExFilesInfo::eftHyperlink; - return pInfo; + return &m_arAudios[i]; } - pInfo = LockVideo(dwID); - if (NULL != pInfo) - { - eType = CExFilesInfo::eftVideo; - return pInfo; - } - pInfo = LockAudio(dwID); - if (NULL != pInfo) - { - eType = CExFilesInfo::eftAudio; - return pInfo; - } - eType = CExFilesInfo::eftNone; - return LockImage(dwID); } - }; + + return NULL; + } + CExFilesInfo* LockAudioFromCollection(_UINT32 dwID) + { + size_t nCount = m_arAudioCollection.size(); + for (size_t i = 0; i < nCount; ++i) + { + if (dwID == m_arAudioCollection[i].m_dwID) + { + return &m_arAudioCollection[i]; + } + } + + return NULL; + } + + CExFilesInfo* Lock(_UINT32 dwID, CExFilesInfo::ExFilesType& eType) + { + CExFilesInfo* pInfo = NULL; + + pInfo = LockHyperlink(dwID); + if (NULL != pInfo) + { + eType = CExFilesInfo::eftHyperlink; + return pInfo; + } + pInfo = LockVideo(dwID); + if (NULL != pInfo) + { + eType = CExFilesInfo::eftVideo; + return pInfo; + } + pInfo = LockAudio(dwID); + if (NULL != pInfo) + { + eType = CExFilesInfo::eftAudio; + return pInfo; + } + pInfo = LockSlide(dwID); + if (NULL != pInfo) + { + eType = CExFilesInfo::eftSlide; + return pInfo; + } + eType = CExFilesInfo::eftNone; + return LockImage(dwID); + } +}; } namespace ODRAW { - class CColor +class CColor +{ +public: + BYTE R; + BYTE G; + BYTE B; + BYTE A; + + LONG m_lSchemeIndex; + + CColor() { - public: - BYTE R; - BYTE G; - BYTE B; - BYTE A; + R = 0; + G = 0; + B = 0; + A = 255; - LONG m_lSchemeIndex; + m_lSchemeIndex = -1; + } + CColor(_UINT32 rgb) + { + (*this) = CreateColor(rgb); + } + CColor& operator =(const CColor& oSrc) + { + R = oSrc.R; + G = oSrc.G; + B = oSrc.B; + A = oSrc.A; - CColor() + m_lSchemeIndex = oSrc.m_lSchemeIndex; + return (*this); + } + inline bool IsEqual(const CColor& oSrc) + { + return ((R == oSrc.R) && (G == oSrc.G) && (B == oSrc.B) && (m_lSchemeIndex == oSrc.m_lSchemeIndex)); + } + static CColor CreateColor(_UINT32 dwColor) + { + CColor oColor; + oColor.R = (BYTE)(dwColor >> 16); + oColor.G = (BYTE)(dwColor >> 8); + oColor.B = (BYTE)(dwColor); + oColor.A = 0xFF; + + oColor.m_lSchemeIndex = -1; + return oColor; + } + + CColor& operator =(const _UINT32& oSrc) + { + R = (BYTE)(oSrc >> 8); + G = (BYTE)(oSrc >> 16); + B = (BYTE)(oSrc >> 24); + A = (BYTE)oSrc; + + m_lSchemeIndex = -1; + return (*this); + } + void SetSBGR(const _UINT32& lBGR) + { + R = (BYTE)(lBGR); + G = (BYTE)(lBGR >> 8); + B = (BYTE)(lBGR >> 16); + + if (lBGR & 0xFF000000) + m_lSchemeIndex = R; + } + void SetBGR(const LONG& lBGR) + { + R = (BYTE)(lBGR); + G = (BYTE)(lBGR >> 8); + B = (BYTE)(lBGR >> 16); + + m_lSchemeIndex = -1; + } + void SetRGB(BYTE r, BYTE g, BYTE b) + { + R = r; + G = g; + B = b; + + m_lSchemeIndex = -1; + } + void SetR(BYTE r){ R = r; } + void SetG(BYTE g){ G = g; } + void SetB(BYTE b){ B = b; } + + BYTE GetR(){ return R; } + BYTE GetG(){ return G; } + BYTE GetB(){ return B; } + + friend bool operator==(const CColor& color1, const CColor& color2) + { + return ((color1.R == color2.R) && (color1.G == color2.G) && (color1.B == color2.B)); + } + + LONG GetLONG() const + { + LONG dwColor = 0; + dwColor |= R; + dwColor |= (G << 8); + dwColor |= (B << 16); + + return dwColor; + } + LONG GetLONG_RGB() const + { + LONG dwColor = 0; + dwColor |= B; + dwColor |= (G << 8); + dwColor |= (R << 16); + + return dwColor; + } + + std::wstring ToString() + { + _UINT32 dwColor = 0; + dwColor |= R; + dwColor |= (G << 8); + dwColor |= (B << 16); + return std::to_wstring((int)dwColor); + } + + void FromString(std::wstring str) + { + int lColor; + if (str.find(_T("#")) == 0) { - R = 0; - G = 0; - B = 0; + lColor = XmlUtils::GetColorBGR(str.substr(1, 6)); + R = (BYTE)(lColor); + G = (BYTE)(lColor >> 8); + B = (BYTE)(lColor >> 16); A = 255; + } + else + { + size_t nLen = str.length(); + wchar_t* pBuffer = (wchar_t*)str.c_str(); + wchar_t* pBuffer1 = pBuffer; + wchar_t* pBuffer2 = pBuffer; + wchar_t* pBufferEnd = pBuffer + nLen; + + while ((pBuffer1 < pBufferEnd) && !XmlUtils::IsDigit(*pBuffer1)) + ++pBuffer1; + pBuffer2 = pBuffer1; + while ((pBuffer2 < pBufferEnd) && XmlUtils::IsDigit(*pBuffer2)) + ++pBuffer2; + R = _GetColor(pBuffer1, pBuffer2); + + pBuffer1 = pBuffer2; + while ((pBuffer1 < pBufferEnd) && !XmlUtils::IsDigit(*pBuffer1)) + ++pBuffer1; + pBuffer2 = pBuffer1; + while ((pBuffer2 < pBufferEnd) && XmlUtils::IsDigit(*pBuffer2)) + ++pBuffer2; + G = _GetColor(pBuffer1, pBuffer2); + + pBuffer1 = pBuffer2; + while ((pBuffer1 < pBufferEnd) && !XmlUtils::IsDigit(*pBuffer1)) + ++pBuffer1; + pBuffer2 = pBuffer1; + while ((pBuffer2 < pBufferEnd) && XmlUtils::IsDigit(*pBuffer2)) + ++pBuffer2; + B = _GetColor(pBuffer1, pBuffer2); + + A = 0xFF; m_lSchemeIndex = -1; } - CColor(_UINT32 rgb) - { - (*this) = CreateColor(rgb); - } - CColor& operator =(const CColor& oSrc) - { - R = oSrc.R; - G = oSrc.G; - B = oSrc.B; - A = oSrc.A; - - m_lSchemeIndex = oSrc.m_lSchemeIndex; - return (*this); - } - inline bool IsEqual(const CColor& oSrc) - { - return ((R == oSrc.R) && (G == oSrc.G) && (B == oSrc.B) && (m_lSchemeIndex == oSrc.m_lSchemeIndex)); - } - static CColor CreateColor(_UINT32 dwColor) - { - CColor oColor; - oColor.R = (BYTE)(dwColor >> 16); - oColor.G = (BYTE)(dwColor >> 8); - oColor.B = (BYTE)(dwColor); - oColor.A = 0xFF; - - oColor.m_lSchemeIndex = -1; - return oColor; - } - - CColor& operator =(const _UINT32& oSrc) - { - R = (BYTE)(oSrc >> 8); - G = (BYTE)(oSrc >> 16); - B = (BYTE)(oSrc >> 24); - A = (BYTE)oSrc; - - m_lSchemeIndex = -1; - return (*this); - } - void SetSBGR(const _UINT32& lBGR) - { - R = (BYTE)(lBGR); - G = (BYTE)(lBGR >> 8); - B = (BYTE)(lBGR >> 16); - - if (lBGR & 0xFF000000) - m_lSchemeIndex = R; - } - void SetBGR(const LONG& lBGR) - { - R = (BYTE)(lBGR); - G = (BYTE)(lBGR >> 8); - B = (BYTE)(lBGR >> 16); - - m_lSchemeIndex = -1; - } - void SetRGB(BYTE r, BYTE g, BYTE b) - { - R = r; - G = g; - B = b; - - m_lSchemeIndex = -1; - } - void SetR(BYTE r){ R = r; } - void SetG(BYTE g){ G = g; } - void SetB(BYTE b){ B = b; } - - BYTE GetR(){ return R; } - BYTE GetG(){ return G; } - BYTE GetB(){ return B; } - - friend bool operator==(const CColor& color1, const CColor& color2) - { - return ((color1.R == color2.R) && (color1.G == color2.G) && (color1.B == color2.B)); - } - - LONG GetLONG() const - { - LONG dwColor = 0; - dwColor |= R; - dwColor |= (G << 8); - dwColor |= (B << 16); - - return dwColor; - } - LONG GetLONG_RGB() const - { - LONG dwColor = 0; - dwColor |= B; - dwColor |= (G << 8); - dwColor |= (R << 16); - - return dwColor; - } - - std::wstring ToString() - { - _UINT32 dwColor = 0; - dwColor |= R; - dwColor |= (G << 8); - dwColor |= (B << 16); - return std::to_wstring((int)dwColor); - } - - void FromString(std::wstring str) - { - int lColor; - if (str.find(_T("#")) == 0) - { - lColor = XmlUtils::GetColorBGR(str.substr(1, 6)); - R = (BYTE)(lColor); - G = (BYTE)(lColor >> 8); - B = (BYTE)(lColor >> 16); - A = 255; - } - else - { - size_t nLen = str.length(); - - wchar_t* pBuffer = (wchar_t*)str.c_str(); - wchar_t* pBuffer1 = pBuffer; - wchar_t* pBuffer2 = pBuffer; - wchar_t* pBufferEnd = pBuffer + nLen; - - while ((pBuffer1 < pBufferEnd) && !XmlUtils::IsDigit(*pBuffer1)) - ++pBuffer1; - pBuffer2 = pBuffer1; - while ((pBuffer2 < pBufferEnd) && XmlUtils::IsDigit(*pBuffer2)) - ++pBuffer2; - R = _GetColor(pBuffer1, pBuffer2); - - pBuffer1 = pBuffer2; - while ((pBuffer1 < pBufferEnd) && !XmlUtils::IsDigit(*pBuffer1)) - ++pBuffer1; - pBuffer2 = pBuffer1; - while ((pBuffer2 < pBufferEnd) && XmlUtils::IsDigit(*pBuffer2)) - ++pBuffer2; - G = _GetColor(pBuffer1, pBuffer2); - - pBuffer1 = pBuffer2; - while ((pBuffer1 < pBufferEnd) && !XmlUtils::IsDigit(*pBuffer1)) - ++pBuffer1; - pBuffer2 = pBuffer1; - while ((pBuffer2 < pBufferEnd) && XmlUtils::IsDigit(*pBuffer2)) - ++pBuffer2; - B = _GetColor(pBuffer1, pBuffer2); - - A = 0xFF; - m_lSchemeIndex = -1; - } - } - void From_UINT32(_UINT32 dwVal) - { - - } - - private: - BYTE _GetColor(wchar_t* pChar1, wchar_t* pChar2) - { - if (pChar1 == pChar2) - return 0; - std::wstring s(pChar1, (int)(pChar2 - pChar1)); - return (BYTE)XmlUtils::GetInteger(s); - } - }; - - class CPen + } + void From_UINT32(_UINT32 dwVal) { - public: - CColor Color; - long Alpha; - long Size; - unsigned char DashStyle; - unsigned char LineStyle; - unsigned char LineJoin; - - unsigned char LineEndCap; - unsigned char LineEndLength; - unsigned char LineEndWidth; + } - unsigned char LineStartCap; - unsigned char LineStartLength; - unsigned char LineStartWidth; +private: + BYTE _GetColor(wchar_t* pChar1, wchar_t* pChar2) + { + if (pChar1 == pChar2) + return 0; + std::wstring s(pChar1, (int)(pChar2 - pChar1)); + return (BYTE)XmlUtils::GetInteger(s); + } +}; - double* DashPattern; - long Count; +class CPen +{ +public: + CColor Color; + long Alpha; + long Size; - double DashOffset; + unsigned char DashStyle; + unsigned char LineStyle; + unsigned char LineJoin; - LONG Align; - double MiterLimit; + unsigned char LineEndCap; + unsigned char LineEndLength; + unsigned char LineEndWidth; - CColor Color2; //backLine + unsigned char LineStartCap; + unsigned char LineStartLength; + unsigned char LineStartWidth; - void GetDashPattern(double* arrDashPattern, long& nCount) const + double* DashPattern; + long Count; + + double DashOffset; + + LONG Align; + double MiterLimit; + + CColor Color2; //backLine + + void GetDashPattern(double* arrDashPattern, long& nCount) const + { + if (nCount == Count) { - if (nCount == Count) + for (int i = 0; i < Count; ++i) { - for (int i = 0; i < Count; ++i) - { - arrDashPattern[i] = DashPattern[i]; - } + arrDashPattern[i] = DashPattern[i]; } } - void SetDashPattern(double* arrDashPattern, long nCount) + } + void SetDashPattern(double* arrDashPattern, long nCount) + { + if ((arrDashPattern == NULL) || (nCount == 0)) { - if ((arrDashPattern == NULL) || (nCount == 0)) + Count = 0; + RELEASEARRAYOBJECTS(DashPattern); + } + else + { + if (Count != nCount) { - Count = 0; + Count = nCount; RELEASEARRAYOBJECTS(DashPattern); - } - else - { - if (Count != nCount) - { - Count = nCount; - RELEASEARRAYOBJECTS(DashPattern); - DashPattern = new double[Count]; - } - - for (int i = 0; i < Count; ++i) - { - DashPattern[i] = arrDashPattern[i]; - } - } - } - - void ScaleAlpha( double dScale ) - { - long dNewAlpha = long(Alpha * dScale + 0.5); - - if( dNewAlpha > 255 ) dNewAlpha = 255; - else if( dNewAlpha < 0 ) dNewAlpha = 0; - - Alpha = dNewAlpha; - } - - bool IsEqual(CPen* pPen) - { - if (NULL == pPen) - return false; - - return ((Color == pPen->Color) && (Alpha == pPen->Alpha) && (Size == pPen->Size) && - (DashStyle == pPen->DashStyle) && (LineStartCap == pPen->LineStartCap) && - (LineEndCap == pPen->LineEndCap) && (LineJoin == pPen->LineJoin)); - } - void SetToRenderer(IRenderer *pRenderer) - { - if (-1 == Color.m_lSchemeIndex) - pRenderer->put_PenColor(Color.GetLONG()); - else - { - LONG lColor = Color.GetLONG(); - lColor |= (0xFF000000 & ((Color.m_lSchemeIndex + 1 + 100) << 24)); - pRenderer->put_PenColor(lColor); - } - pRenderer->put_PenAlpha(Alpha); - pRenderer->put_PenSize(Size); - pRenderer->put_PenDashStyle(DashStyle); - pRenderer->put_PenLineStartCap(LineStartCap); - pRenderer->put_PenLineEndCap(LineEndCap); - pRenderer->put_PenLineJoin(LineJoin); - pRenderer->put_PenAlign(Align); - - if (DashStyle != Gdiplus::DashStyleSolid) - { - - - pRenderer->PenDashPattern(DashPattern, Count); - - - pRenderer->put_PenDashOffset(DashOffset); - } - } - void SetDefaultParams() - { - Alpha = 255; - Size = 9524; - - LineStyle = 0; //single(Simple) - DashStyle = 0; //Solid - LineJoin = 2; //round - - LineStartCap = 0; - LineEndCap = 0; - LineEndLength = 1; //med - LineStartLength = 1; - LineEndWidth = 1; - LineStartWidth = 1; - - DashPattern = NULL; - Count = 0; - - Color.SetRGB (0x00, 0x00, 0x00); - Color2.SetRGB (0xff, 0xff, 0xff); - - DashOffset = 0; - Align = Gdiplus::PenAlignmentCenter; - MiterLimit = 0.5; - } - - CPen() - { - SetDefaultParams(); - } - CPen( const CPen& other ) - { - *this = other; - } - CPen& operator=(const CPen& other) - { - Color = other.Color; - Color2 = other.Color2; - Alpha = other.Alpha; - Size = other.Size; - - DashStyle = other.DashStyle; - LineStartCap = other.LineStartCap; - LineEndCap = other.LineEndCap; - LineJoin = other.LineJoin; - - RELEASEARRAYOBJECTS(DashPattern); - Count = other.Count; - if (Count != 0) - { DashPattern = new double[Count]; - for (int i = 0; i < Count; ++i) - { - DashPattern[i] = other.DashPattern[i]; - } } - DashOffset = other.DashOffset; - Align = other.Align; - MiterLimit = other.MiterLimit; - - return *this; - } - virtual ~CPen() - { - RELEASEARRAYOBJECTS(DashPattern); + for (int i = 0; i < Count; ++i) + { + DashPattern[i] = arrDashPattern[i]; + } } + } - }; - - class CBrush + void ScaleAlpha( double dScale ) { - public: - long Type; + long dNewAlpha = long(Alpha * dScale + 0.5); - CColor Color1; - CColor Color2; + if( dNewAlpha > 255 ) dNewAlpha = 255; + else if( dNewAlpha < 0 ) dNewAlpha = 0; - long Alpha1; - long Alpha2; + Alpha = dNewAlpha; + } - std::wstring TexturePath; - long TextureAlpha; - long TextureMode; + bool IsEqual(CPen* pPen) + { + if (NULL == pPen) + return false; - bool Rectable; - Gdiplus::RectF Rect; - - double LinearAngle; - - std::vector> ColorsPosition; - - inline LONG ConstantCompatible(LONG nConstant) + return ((Color == pPen->Color) && (Alpha == pPen->Alpha) && (Size == pPen->Size) && + (DashStyle == pPen->DashStyle) && (LineStartCap == pPen->LineStartCap) && + (LineEndCap == pPen->LineEndCap) && (LineJoin == pPen->LineJoin)); + } + void SetToRenderer(IRenderer *pRenderer) + { + if (-1 == Color.m_lSchemeIndex) + pRenderer->put_PenColor(Color.GetLONG()); + else { - if( c_BrushTypeDiagonal1_ == nConstant ) - nConstant = c_BrushTypeDiagonal2_; - else if( c_BrushTypeDiagonal2_ == nConstant ) - nConstant = c_BrushTypeDiagonal1_; + LONG lColor = Color.GetLONG(); + lColor |= (0xFF000000 & ((Color.m_lSchemeIndex + 1 + 100) << 24)); + pRenderer->put_PenColor(lColor); + } + pRenderer->put_PenAlpha(Alpha); + pRenderer->put_PenSize(Size); + pRenderer->put_PenDashStyle(DashStyle); + pRenderer->put_PenLineStartCap(LineStartCap); + pRenderer->put_PenLineEndCap(LineEndCap); + pRenderer->put_PenLineJoin(LineJoin); + pRenderer->put_PenAlign(Align); - if (1000 <= nConstant) - return nConstant; - if (c_BrushTypeSolid_ == nConstant) - return nConstant + 1000; - if (c_BrushTypeHorizontal_ <= nConstant && c_BrushTypePathGradient2_ >= nConstant) - return nConstant + 2000; - if (c_BrushTypeTexture_ == nConstant) - return nConstant + 3000; - if (c_BrushTypeHatch1_ <= nConstant && c_BrushTypeHatch53_ >= nConstant) - return nConstant + 4000; - if (c_BrushTypeGradient1_ <= nConstant && c_BrushTypeGradient6_ >= nConstant) - return nConstant + 2000 - 61; + if (DashStyle != Gdiplus::DashStyleSolid) + { - return 1000; + + pRenderer->PenDashPattern(DashPattern, Count); + + + pRenderer->put_PenDashOffset(DashOffset); + } + } + void SetDefaultParams() + { + Alpha = 255; + Size = 9524; + + LineStyle = 0; //single(Simple) + DashStyle = 0; //Solid + LineJoin = 2; //round + + LineStartCap = 0; + LineEndCap = 0; + LineEndLength = 1; //med + LineStartLength = 1; + LineEndWidth = 1; + LineStartWidth = 1; + + DashPattern = NULL; + Count = 0; + + Color.SetRGB (0x00, 0x00, 0x00); + Color2.SetRGB (0xff, 0xff, 0xff); + + DashOffset = 0; + Align = Gdiplus::PenAlignmentCenter; + MiterLimit = 0.5; + } + + CPen() + { + SetDefaultParams(); + } + CPen( const CPen& other ) + { + *this = other; + } + CPen& operator=(const CPen& other) + { + Color = other.Color; + Color2 = other.Color2; + Alpha = other.Alpha; + Size = other.Size; + + DashStyle = other.DashStyle; + LineStartCap = other.LineStartCap; + LineEndCap = other.LineEndCap; + LineJoin = other.LineJoin; + + RELEASEARRAYOBJECTS(DashPattern); + Count = other.Count; + if (Count != 0) + { + DashPattern = new double[Count]; + for (int i = 0; i < Count; ++i) + { + DashPattern[i] = other.DashPattern[i]; + } } - void ScaleAlpha1( double dScale ) - { - long dNewAlpha = long(Alpha1 * dScale + 0.5); + DashOffset = other.DashOffset; + Align = other.Align; + MiterLimit = other.MiterLimit; - if( dNewAlpha > 255 ) dNewAlpha = 255; - else if( dNewAlpha < 0 ) dNewAlpha = 0; + return *this; + } + virtual ~CPen() + { + RELEASEARRAYOBJECTS(DashPattern); + } - Alpha1 = dNewAlpha; - } - void ScaleAlpha2( double dScale ) - { - long dNewAlpha = long(Alpha2 * dScale + 0.5); +}; - if( dNewAlpha > 255 ) dNewAlpha = 255; - else if( dNewAlpha < 0 ) dNewAlpha = 0; +class CBrush +{ +public: + long Type; - Alpha2 = dNewAlpha; - } + CColor Color1; + CColor Color2; - void ScaleTextureAlpha( double dScale ) - { - long dNewAlpha = long(TextureAlpha * dScale + 0.5); + long Alpha1; + long Alpha2; - if( dNewAlpha > 255 ) dNewAlpha = 255; - else if( dNewAlpha < 0 ) dNewAlpha = 0; + std::wstring TexturePath; + long TextureAlpha; + long TextureMode; - TextureAlpha = dNewAlpha; - } + bool Rectable; + Gdiplus::RectF Rect; + + double LinearAngle; + + std::vector> ColorsPosition; + + inline LONG ConstantCompatible(LONG nConstant) + { + if( c_BrushTypeDiagonal1_ == nConstant ) + nConstant = c_BrushTypeDiagonal2_; + else if( c_BrushTypeDiagonal2_ == nConstant ) + nConstant = c_BrushTypeDiagonal1_; + + if (1000 <= nConstant) + return nConstant; + if (c_BrushTypeSolid_ == nConstant) + return nConstant + 1000; + if (c_BrushTypeHorizontal_ <= nConstant && c_BrushTypePathGradient2_ >= nConstant) + return nConstant + 2000; + if (c_BrushTypeTexture_ == nConstant) + return nConstant + 3000; + if (c_BrushTypeHatch1_ <= nConstant && c_BrushTypeHatch53_ >= nConstant) + return nConstant + 4000; + if (c_BrushTypeGradient1_ <= nConstant && c_BrushTypeGradient6_ >= nConstant) + return nConstant + 2000 - 61; + + return 1000; + } + + void ScaleAlpha1( double dScale ) + { + long dNewAlpha = long(Alpha1 * dScale + 0.5); + + if( dNewAlpha > 255 ) dNewAlpha = 255; + else if( dNewAlpha < 0 ) dNewAlpha = 0; + + Alpha1 = dNewAlpha; + } + void ScaleAlpha2( double dScale ) + { + long dNewAlpha = long(Alpha2 * dScale + 0.5); + + if( dNewAlpha > 255 ) dNewAlpha = 255; + else if( dNewAlpha < 0 ) dNewAlpha = 0; + + Alpha2 = dNewAlpha; + } + + void ScaleTextureAlpha( double dScale ) + { + long dNewAlpha = long(TextureAlpha * dScale + 0.5); + + if( dNewAlpha > 255 ) dNewAlpha = 255; + else if( dNewAlpha < 0 ) dNewAlpha = 0; + + TextureAlpha = dNewAlpha; + } - bool IsEqual(CBrush* pBrush) - { - if (NULL == pBrush) - return false; + bool IsEqual(CBrush* pBrush) + { + if (NULL == pBrush) + return false; - /*return ((Type == pBrush->Type) && + /*return ((Type == pBrush->Type) && (Color1 == pBrush->Color1) && (Color2 == pBrush->Color2) && (Alpha1 == pBrush->Alpha1) && (Alpha2 == pBrush->Alpha2));*/ - return ((Type == pBrush->Type) && - (Color1 == pBrush->Color1) && (Color2 == pBrush->Color2) && - (Alpha1 == pBrush->Alpha1) && (Alpha2 == pBrush->Alpha2) && (LinearAngle == pBrush->LinearAngle) && - (TexturePath == pBrush->TexturePath) && (TextureAlpha == pBrush->TextureAlpha) && (TextureMode == pBrush->TextureMode) && - (Rectable == pBrush->Rectable) && (Rect.Equals(pBrush->Rect))); - } + return ((Type == pBrush->Type) && + (Color1 == pBrush->Color1) && (Color2 == pBrush->Color2) && + (Alpha1 == pBrush->Alpha1) && (Alpha2 == pBrush->Alpha2) && (LinearAngle == pBrush->LinearAngle) && + (TexturePath == pBrush->TexturePath) && (TextureAlpha == pBrush->TextureAlpha) && (TextureMode == pBrush->TextureMode) && + (Rectable == pBrush->Rectable) && (Rect.Equals(pBrush->Rect))); + } - void SetDefaultParams() + void SetDefaultParams() + { + Type = c_BrushTypeNotSet; + + Color1 = 0xFFFFFFFF; + Alpha1 = 255; + Color2 = 0xFFFFFFFF; + Alpha2 = 255; + + TextureAlpha = 255; + TextureMode = c_BrushTextureModeStretch; + + LinearAngle = 0; + + TexturePath = _T(""); + + Rectable = false; + + Rect.X = 0.0F; + Rect.Y = 0.0F; + Rect.Width = 0.0F; + Rect.Height = 0.0F; + + ColorsPosition.clear(); + } + + CBrush() + { + SetDefaultParams(); + } + CBrush( const CBrush& other ) + { + Type = other.Type; + + Color1 = other.Color1; + Alpha1 = other.Alpha1; + Color2 = other.Color2; + Alpha2 = other.Alpha2; + + TexturePath = other.TexturePath; + TextureAlpha = other.TextureAlpha; + TextureMode = other.TextureMode; + + Rectable = other.Rectable; + Rect = other.Rect; + + LinearAngle = other.LinearAngle; + + ColorsPosition = other.ColorsPosition; + } + CBrush& operator=(const CBrush& other) + { + Type = other.Type; + + Color1 = other.Color1; + Alpha1 = other.Alpha1; + Color2 = other.Color2; + Alpha2 = other.Alpha2; + + TexturePath = other.TexturePath; + TextureAlpha = other.TextureAlpha; + TextureMode = other.TextureMode; + + Rectable = other.Rectable; + Rect = other.Rect; + + LinearAngle = other.LinearAngle; + + ColorsPosition = other.ColorsPosition; + return *this; + } + virtual ~CBrush() + { + } + + bool IsTexture() + { + return (c_BrushTypeTexture == Type); + } + bool IsOneColor() + { + return (c_BrushTypeSolid == Type); + } + bool IsTwoColor() + { + return ((c_BrushTypeHorizontal <= Type && c_BrushTypeCylinderVer >= Type) || + (c_BrushTypeHatch1 <= Type && c_BrushTypeHatch53 >= Type)); + } + + void SetToRenderer(IRenderer *pRenderer) + { + Type = ConstantCompatible(Type); + pRenderer->put_BrushType(Type); + if (IsOneColor()) { - Type = c_BrushTypeNotSet; + //pRenderer->put_BrushColor1(Color1.GetLONG()); - Color1 = 0xFFFFFFFF; - Alpha1 = 255; - Color2 = 0xFFFFFFFF; - Alpha2 = 255; - - TextureAlpha = 255; - TextureMode = c_BrushTextureModeStretch; - - LinearAngle = 0; - - TexturePath = _T(""); - - Rectable = false; - - Rect.X = 0.0F; - Rect.Y = 0.0F; - Rect.Width = 0.0F; - Rect.Height = 0.0F; - - ColorsPosition.clear(); - } - - CBrush() - { - SetDefaultParams(); - } - CBrush( const CBrush& other ) - { - Type = other.Type; - - Color1 = other.Color1; - Alpha1 = other.Alpha1; - Color2 = other.Color2; - Alpha2 = other.Alpha2; - - TexturePath = other.TexturePath; - TextureAlpha = other.TextureAlpha; - TextureMode = other.TextureMode; - - Rectable = other.Rectable; - Rect = other.Rect; - - LinearAngle = other.LinearAngle; - - ColorsPosition = other.ColorsPosition; - } - CBrush& operator=(const CBrush& other) - { - Type = other.Type; - - Color1 = other.Color1; - Alpha1 = other.Alpha1; - Color2 = other.Color2; - Alpha2 = other.Alpha2; - - TexturePath = other.TexturePath; - TextureAlpha = other.TextureAlpha; - TextureMode = other.TextureMode; - - Rectable = other.Rectable; - Rect = other.Rect; - - LinearAngle = other.LinearAngle; - - ColorsPosition = other.ColorsPosition; - return *this; - } - virtual ~CBrush() - { - } - - bool IsTexture() - { - return (c_BrushTypeTexture == Type); - } - bool IsOneColor() - { - return (c_BrushTypeSolid == Type); - } - bool IsTwoColor() - { - return ((c_BrushTypeHorizontal <= Type && c_BrushTypeCylinderVer >= Type) || - (c_BrushTypeHatch1 <= Type && c_BrushTypeHatch53 >= Type)); - } - - void SetToRenderer(IRenderer *pRenderer) - { - Type = ConstantCompatible(Type); - pRenderer->put_BrushType(Type); - if (IsOneColor()) + if (-1 == Color1.m_lSchemeIndex) + pRenderer->put_BrushColor1(Color1.GetLONG()); + else { - //pRenderer->put_BrushColor1(Color1.GetLONG()); - - if (-1 == Color1.m_lSchemeIndex) - pRenderer->put_BrushColor1(Color1.GetLONG()); - else - { - LONG lColor = Color1.GetLONG(); - lColor |= (0xFF000000 & ((Color1.m_lSchemeIndex + 1 + 100) << 24)); - pRenderer->put_BrushColor1(lColor); - } - - pRenderer->put_BrushAlpha1(Alpha1); + LONG lColor = Color1.GetLONG(); + lColor |= (0xFF000000 & ((Color1.m_lSchemeIndex + 1 + 100) << 24)); + pRenderer->put_BrushColor1(lColor); } - else if (IsTexture()) + + pRenderer->put_BrushAlpha1(Alpha1); + } + else if (IsTexture()) + { + //BSTR bstrTexturePath = TexturePath.AllocSysString(); + pRenderer->put_BrushTexturePath(TexturePath); + //SysFreeString(bstrTexturePath); + pRenderer->put_BrushTextureMode(TextureMode); + pRenderer->put_BrushTextureAlpha(TextureAlpha); + pRenderer->BrushRect(Rectable, Rect.X, Rect.Y, Rect.Width, Rect.Height); + } + else if (IsTwoColor()) + { + //pRenderer->put_BrushColor1(Color1.GetLONG()); + + if (-1 == Color1.m_lSchemeIndex) + pRenderer->put_BrushColor1(Color1.GetLONG()); + else { - //BSTR bstrTexturePath = TexturePath.AllocSysString(); - pRenderer->put_BrushTexturePath(TexturePath); - //SysFreeString(bstrTexturePath); - pRenderer->put_BrushTextureMode(TextureMode); - pRenderer->put_BrushTextureAlpha(TextureAlpha); - pRenderer->BrushRect(Rectable, Rect.X, Rect.Y, Rect.Width, Rect.Height); + LONG lColor = Color1.GetLONG(); + lColor |= (0xFF000000 & ((Color1.m_lSchemeIndex + 1 + 100) << 24)); + pRenderer->put_BrushColor1(lColor); } - else if (IsTwoColor()) - { - //pRenderer->put_BrushColor1(Color1.GetLONG()); - if (-1 == Color1.m_lSchemeIndex) - pRenderer->put_BrushColor1(Color1.GetLONG()); - else - { - LONG lColor = Color1.GetLONG(); - lColor |= (0xFF000000 & ((Color1.m_lSchemeIndex + 1 + 100) << 24)); - pRenderer->put_BrushColor1(lColor); - } - - pRenderer->put_BrushAlpha1(Alpha1); - pRenderer->put_BrushColor2(Color2.GetLONG()); - pRenderer->put_BrushAlpha2(Alpha2); - } + pRenderer->put_BrushAlpha1(Alpha1); + pRenderer->put_BrushColor2(Color2.GetLONG()); + pRenderer->put_BrushAlpha2(Alpha2); } - }; + } +}; - class CFont +class CFont +{ +public: + std::wstring Path; + std::wstring Name; + double Size; + bool Bold; + bool Italic; + BYTE Underline; + BYTE Strikeout; + + bool StringGID; + double CharSpace; + + BYTE PitchFamily; + BYTE Charset; + bool Monospace; + + bool IsEqual(CFont* pFont) { - public: - std::wstring Path; - std::wstring Name; - double Size; - bool Bold; - bool Italic; - BYTE Underline; - BYTE Strikeout; + if (NULL == pFont) + return false; - bool StringGID; - double CharSpace; - - BYTE PitchFamily; - BYTE Charset; - bool Monospace; - - bool IsEqual(CFont* pFont) - { - if (NULL == pFont) - return false; - - return ((Name == pFont->Name) && (Path == pFont->Path) && (StringGID == pFont->StringGID) && (Size == pFont->Size) && - (Bold == pFont->Bold) && (Italic == pFont->Italic) && - (Underline == pFont->Underline) && (Strikeout == pFont->Strikeout)); - } - bool IsEqual2(CFont* pFont) - { - if (NULL == pFont) - return false; - - return ((Name == pFont->Name) && (Path == pFont->Path) && (StringGID == pFont->StringGID) && (Size == pFont->Size) && - (Bold == pFont->Bold) && (Italic == pFont->Italic)); - } - - LONG GetStyle() const - { - LONG lStyle = 0; - if (Bold) - lStyle |= 0x01; - if (Italic) - lStyle |= 0x02; - lStyle |= Underline << 2; - lStyle |= Strikeout << 7; - return lStyle; - } - void SetStyle(LONG const& lStyle) - { - Bold = (0x01 == (0x01 & lStyle)); - Italic = (0x02 == (0x02 & lStyle)); - Underline = (BYTE)(0x7C & lStyle) >> 2; - Strikeout = (BYTE)(0x0180 & lStyle) >> 7; - } - void SetToRenderer(IRenderer *pRenderer) - { - pRenderer->put_FontName(Name); - pRenderer->put_FontPath(Path); - - - pRenderer->put_FontSize(Size); - pRenderer->put_FontStyle(GetStyle()); - pRenderer->put_FontStringGID(StringGID); - pRenderer->put_FontCharSpace(CharSpace); - } - void SetDefaultParams() - { - Name = _T("Arial"); - Path = _T(""); - - Size = 0; - Bold = false; - Italic = false; - Underline = 0; - Strikeout = 0; - - StringGID = false; - CharSpace = 0.0; - - PitchFamily = 0; - Charset = 0; - Monospace = false; - } - - CFont() - { - SetDefaultParams(); - } - CFont( const CFont& other ) - { - *this = other; - } - CFont& operator=(const CFont& other) - { - Name = other.Name; - Path = other.Path; - Size = other.Size; - Bold = other.Bold; - Italic = other.Italic; - Underline = other.Underline; - Strikeout = other.Strikeout; - - StringGID = other.StringGID; - CharSpace = other.CharSpace; - - PitchFamily = other.PitchFamily; - Charset = other.Charset; - Monospace = other.Monospace; - - return *this; - } - virtual ~CFont() - { - } - }; - - class CShadow + return ((Name == pFont->Name) && (Path == pFont->Path) && (StringGID == pFont->StringGID) && (Size == pFont->Size) && + (Bold == pFont->Bold) && (Italic == pFont->Italic) && + (Underline == pFont->Underline) && (Strikeout == pFont->Strikeout)); + } + bool IsEqual2(CFont* pFont) { - public: + if (NULL == pFont) + return false; - bool Visible; + return ((Name == pFont->Name) && (Path == pFont->Path) && (StringGID == pFont->StringGID) && (Size == pFont->Size) && + (Bold == pFont->Bold) && (Italic == pFont->Italic)); + } - double DistanceX; - double DistanceY; - - double OriginX; - double OriginY; - - double BlurSize; - CColor Color; - long Alpha; - - int Type; - - double ScaleXToX; - double ScaleXToY; - double ScaleYToX; - double ScaleYToY; - - int PerspectiveX; - int PerspectiveY; - - void SetDefaultParams() - { - Visible = false; - DistanceX = 25400; - DistanceY = 25400; - BlurSize = 0; - Alpha = 255; - - OriginX = 0; - OriginY = 0; - - Type = -1; - - ScaleXToX = 1.; - ScaleXToY = 1.; - ScaleYToX = 1.; - ScaleYToY = 1.; - - PerspectiveX = 0; - PerspectiveY = 0; - - Color.SetRGB(0x80, 0x80, 0x80); - } - - CShadow() - { - SetDefaultParams(); - } - CShadow( const CShadow& other ) - { - Visible = other.Visible; - DistanceX = other.DistanceX; - DistanceY = other.DistanceY; - OriginX = other.OriginX; - OriginY = other.OriginY; - BlurSize = other.BlurSize; - Color = other.Color; - Alpha = other.Alpha; - - Type = other.Type; - - ScaleXToX = other.ScaleXToX; - ScaleXToY = other.ScaleXToY; - ScaleYToX = other.ScaleYToX; - ScaleYToY = other.ScaleYToY; - - PerspectiveX= other.PerspectiveX; - PerspectiveY= other.PerspectiveY; - } - CShadow& operator=(const CShadow& other) - { - Visible = other.Visible; - DistanceX = other.DistanceX; - DistanceY = other.DistanceY; - OriginX = other.OriginX; - OriginY = other.OriginY; - BlurSize = other.BlurSize; - Color = other.Color; - Alpha = other.Alpha; - Type = other.Type; - - PerspectiveX= other.PerspectiveX; - PerspectiveY= other.PerspectiveY; - - ScaleXToX = other.ScaleXToX; - ScaleXToY = other.ScaleXToY; - ScaleYToX = other.ScaleYToX; - ScaleYToY = other.ScaleYToY; - - return *this; - } - virtual ~CShadow() - { - } - }; - - class CEdgeText + LONG GetStyle() const { - public: - - long Visible; - double Dist; - CColor Color; - long Alpha; - - void SetDefaultParams() - { - Visible = 0; - Dist = 5; - Color = 0; - Alpha = 255; - } - - CEdgeText() - { - SetDefaultParams(); - } - CEdgeText( const CEdgeText& other ) - { - Visible = other.Visible; - Dist = other.Dist; - Color = other.Color; - Alpha = other.Alpha; - } - CEdgeText& operator=(const CEdgeText& other) - { - Visible = other.Visible; - Dist = other.Dist; - Color = other.Color; - Alpha = other.Alpha; - - return *this; - } - virtual ~CEdgeText() - { - } - }; - - class CTextAttributes + LONG lStyle = 0; + if (Bold) + lStyle |= 0x01; + if (Italic) + lStyle |= 0x02; + lStyle |= Underline << 2; + lStyle |= Strikeout << 7; + return lStyle; + } + void SetStyle(LONG const& lStyle) { - public: - CFont m_oFont; - CBrush m_oTextBrush; - CShadow m_oTextShadow; - CEdgeText m_oTextEdge; + Bold = (0x01 == (0x01 & lStyle)); + Italic = (0x02 == (0x02 & lStyle)); + Underline = (BYTE)(0x7C & lStyle) >> 2; + Strikeout = (BYTE)(0x0180 & lStyle) >> 7; + } + void SetToRenderer(IRenderer *pRenderer) + { + pRenderer->put_FontName(Name); + pRenderer->put_FontPath(Path); - int m_nTextAlignHorizontal; - int m_nTextAlignVertical; - double m_dTextRotate; - CTextAttributes() : m_oFont(), m_oTextBrush(), m_oTextShadow(), m_oTextEdge() - { - m_oFont.Size = 36; - m_oTextBrush.Color1 = 0xFF; + pRenderer->put_FontSize(Size); + pRenderer->put_FontStyle(GetStyle()); + pRenderer->put_FontStringGID(StringGID); + pRenderer->put_FontCharSpace(CharSpace); + } + void SetDefaultParams() + { + Name = _T("Arial"); + Path = _T(""); - m_nTextAlignHorizontal = 0; - m_nTextAlignVertical = -1; //not set - m_dTextRotate = 0; - } - CTextAttributes& operator =(const CTextAttributes& oSrc) - { - m_oFont = oSrc.m_oFont; - m_oTextBrush = oSrc.m_oTextBrush; - m_oTextShadow = oSrc.m_oTextShadow; - m_oTextEdge = oSrc.m_oTextEdge; + Size = 0; + Bold = false; + Italic = false; + Underline = 0; + Strikeout = 0; - m_nTextAlignHorizontal = oSrc.m_nTextAlignHorizontal; - m_nTextAlignVertical = oSrc.m_nTextAlignVertical; - m_dTextRotate = oSrc.m_dTextRotate; + StringGID = false; + CharSpace = 0.0; + + PitchFamily = 0; + Charset = 0; + Monospace = false; + } + + CFont() + { + SetDefaultParams(); + } + CFont( const CFont& other ) + { + *this = other; + } + CFont& operator=(const CFont& other) + { + Name = other.Name; + Path = other.Path; + Size = other.Size; + Bold = other.Bold; + Italic = other.Italic; + Underline = other.Underline; + Strikeout = other.Strikeout; + + StringGID = other.StringGID; + CharSpace = other.CharSpace; + + PitchFamily = other.PitchFamily; + Charset = other.Charset; + Monospace = other.Monospace; + + return *this; + } + virtual ~CFont() + { + } +}; + +class CShadow +{ +public: + + bool Visible; + + double DistanceX; + double DistanceY; + + double OriginX; + double OriginY; + + double BlurSize; + CColor Color; + long Alpha; + + int Type; + + double ScaleXToX; + double ScaleXToY; + double ScaleYToX; + double ScaleYToY; + + int PerspectiveX; + int PerspectiveY; + + void SetDefaultParams() + { + Visible = false; + DistanceX = 25400; + DistanceY = 25400; + BlurSize = 0; + Alpha = 255; + + OriginX = 0; + OriginY = 0; + + Type = -1; + + ScaleXToX = 1.; + ScaleXToY = 1.; + ScaleYToX = 1.; + ScaleYToY = 1.; + + PerspectiveX = 0; + PerspectiveY = 0; + + Color.SetRGB(0x80, 0x80, 0x80); + } + + CShadow() + { + SetDefaultParams(); + } + CShadow( const CShadow& other ) + { + Visible = other.Visible; + DistanceX = other.DistanceX; + DistanceY = other.DistanceY; + OriginX = other.OriginX; + OriginY = other.OriginY; + BlurSize = other.BlurSize; + Color = other.Color; + Alpha = other.Alpha; + + Type = other.Type; + + ScaleXToX = other.ScaleXToX; + ScaleXToY = other.ScaleXToY; + ScaleYToX = other.ScaleYToX; + ScaleYToY = other.ScaleYToY; + + PerspectiveX= other.PerspectiveX; + PerspectiveY= other.PerspectiveY; + } + CShadow& operator=(const CShadow& other) + { + Visible = other.Visible; + DistanceX = other.DistanceX; + DistanceY = other.DistanceY; + OriginX = other.OriginX; + OriginY = other.OriginY; + BlurSize = other.BlurSize; + Color = other.Color; + Alpha = other.Alpha; + Type = other.Type; + + PerspectiveX= other.PerspectiveX; + PerspectiveY= other.PerspectiveY; + + ScaleXToX = other.ScaleXToX; + ScaleXToY = other.ScaleXToY; + ScaleYToX = other.ScaleYToX; + ScaleYToY = other.ScaleYToY; + + return *this; + } + virtual ~CShadow() + { + } +}; + +class CEdgeText +{ +public: + + long Visible; + double Dist; + CColor Color; + long Alpha; + + void SetDefaultParams() + { + Visible = 0; + Dist = 5; + Color = 0; + Alpha = 255; + } + + CEdgeText() + { + SetDefaultParams(); + } + CEdgeText( const CEdgeText& other ) + { + Visible = other.Visible; + Dist = other.Dist; + Color = other.Color; + Alpha = other.Alpha; + } + CEdgeText& operator=(const CEdgeText& other) + { + Visible = other.Visible; + Dist = other.Dist; + Color = other.Color; + Alpha = other.Alpha; + + return *this; + } + virtual ~CEdgeText() + { + } +}; + +class CTextAttributes +{ +public: + CFont m_oFont; + CBrush m_oTextBrush; + CShadow m_oTextShadow; + CEdgeText m_oTextEdge; + + int m_nTextAlignHorizontal; + int m_nTextAlignVertical; + double m_dTextRotate; + + CTextAttributes() : m_oFont(), m_oTextBrush(), m_oTextShadow(), m_oTextEdge() + { + m_oFont.Size = 36; + m_oTextBrush.Color1 = 0xFF; + + m_nTextAlignHorizontal = 0; + m_nTextAlignVertical = -1; //not set + m_dTextRotate = 0; + } + CTextAttributes& operator =(const CTextAttributes& oSrc) + { + m_oFont = oSrc.m_oFont; + m_oTextBrush = oSrc.m_oTextBrush; + m_oTextShadow = oSrc.m_oTextShadow; + m_oTextEdge = oSrc.m_oTextEdge; + + m_nTextAlignHorizontal = oSrc.m_nTextAlignHorizontal; + m_nTextAlignVertical = oSrc.m_nTextAlignVertical; + m_dTextRotate = oSrc.m_dTextRotate; + + return (*this); + } +}; - return (*this); - } - }; - } diff --git a/ASCOfficePPTXFile/Editor/Drawing/Document.h b/ASCOfficePPTXFile/Editor/Drawing/Document.h index 172320b4e5..af7038c5f0 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Document.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Document.h @@ -55,7 +55,7 @@ namespace PPT_FORMAT bool m_bMacros; std::wstring m_sVbaProjectFile; - CDocument() : m_bMacros (false) + CDocument() : m_bMacros (true) { m_lSlideWidth = 0; m_lSlideHeight = 0; diff --git a/ASCOfficePPTXFile/Editor/Drawing/Element.h b/ASCOfficePPTXFile/Editor/Drawing/Element.h index 4d2b62a02c..52009a2fbc 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Element.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Element.h @@ -38,183 +38,186 @@ using namespace ODRAW; namespace PPT_FORMAT { - enum ElementType - { - etGroup = 0, - etVideo = 1, - etAudio = 2, - etPicture = 3, - etShape = 4, - etText = 5 - }; +enum ElementType +{ + etGroup = 0, + etVideo = 1, + etAudio = 2, + etPicture = 3, + etShape = 4, + etText = 5, + etTable = 6 +}; - class CTheme; - class CLayout; - class CSlide; +class CTheme; +class CLayout; +class CSlide; - class CElement; - typedef boost::shared_ptr CElementPtr; +class CElement; +typedef boost::shared_ptr CElementPtr; - class CElement - { - public: - ElementType m_etType; - - CDoubleRect m_rcChildAnchor; - CDoubleRect m_rcAnchor; - CDoubleRect m_rcGroupAnchor; +class CElement +{ +public: + ElementType m_etType; - bool m_bChildAnchorEnabled; - bool m_bAnchorEnabled; - bool m_bGroupAnchorEnabled; - - double m_dStartTime; - double m_dEndTime; + CDoubleRect m_rcChildAnchor; + CDoubleRect m_rcAnchor; + CDoubleRect m_rcGroupAnchor; - CTextInteractiveInfo m_oTextActions; - std::vector m_arrActions; + bool m_bChildAnchorEnabled; + bool m_bAnchorEnabled; + bool m_bGroupAnchorEnabled; - CAnimationInfo m_oAnimations; - CEffects m_oEffects; + double m_dStartTime; + double m_dEndTime; - CPen m_oPen; - CBrush m_oBrush; - CShadow m_oShadow; + CTextInteractiveInfo m_oTextActions; - int m_lID; - int m_lLayoutID; + std::vector m_arrActions; + std::vector m_textHyperlinks; - int m_lPlaceholderID; - int m_lPlaceholderType; - bool m_bPlaceholderSet; - int m_lPlaceholderSizePreset; - int m_lPlaceholderUserStr; - int m_nFormatDate; + CAnimationInfo m_oAnimations; + CEffects m_oEffects; - double m_dRotate; // угол поворота в градусах - bool m_bFlipH; // симметричное отражение относительно горизонтальной оси - bool m_bFlipV; // симметричное отражение относительно вертикальной оси + CPen m_oPen; + CBrush m_oBrush; + CShadow m_oShadow; - bool m_bLine; - bool m_bIsFilled; + int m_lID; + int m_lLayoutID; - bool m_bIsBackground; - bool m_bHaveAnchor; - bool m_bHidden; + int m_lPlaceholderID; + int m_lPlaceholderType; + bool m_bPlaceholderSet; + int m_lPlaceholderSizePreset; + int m_lPlaceholderUserStr; + int m_nFormatDate; - CTheme* m_pTheme; - CLayout* m_pLayout; + double m_dRotate; // угол поворота в градусах + bool m_bFlipH; // симметричное отражение относительно горизонтальной оси + bool m_bFlipV; // симметричное отражение относительно вертикальной оси - std::wstring m_sName; - std::wstring m_sDescription; + bool m_bLine; + bool m_bIsFilled; - std::wstring m_sHyperlink; + bool m_bIsBackground; + bool m_bHaveAnchor; + bool m_bHidden; - std::vector* m_pParentElements; - std::vector m_pChildElements; + CTheme* m_pTheme; + CLayout* m_pLayout; - CElement() - { - m_bIsBackground = false; - m_bHaveAnchor = true; - m_bHidden = false; + std::wstring m_sName; + std::wstring m_sDescription; - m_bChildAnchorEnabled = false; - m_bAnchorEnabled = false; - m_bGroupAnchorEnabled = false; + std::wstring m_sHyperlink; - m_lID = -1; - m_lLayoutID = -1; + std::vector* m_pParentElements; + std::vector m_pChildElements; - m_lPlaceholderID = -1; - m_lPlaceholderType = -1; - m_bPlaceholderSet = false; - m_lPlaceholderSizePreset = -1; - m_lPlaceholderUserStr = -1; - m_nFormatDate = 1; + CElement() + { + m_bIsBackground = false; + m_bHaveAnchor = true; + m_bHidden = false; - m_etType = etShape; - - m_dStartTime = 0.0; - m_dEndTime = 30.0; + m_bChildAnchorEnabled = false; + m_bAnchorEnabled = false; + m_bGroupAnchorEnabled = false; - m_dRotate = 0.0; - m_bFlipH = false; - m_bFlipV = false; - m_bLine = true; - m_bIsFilled = true; + m_lID = -1; + m_lLayoutID = -1; - m_pTheme = NULL; - m_pLayout = NULL; - m_pParentElements = NULL; - } - virtual ~CElement() - { - } + m_lPlaceholderID = -1; + m_lPlaceholderType = -1; + m_bPlaceholderSet = false; + m_lPlaceholderSizePreset = -1; + m_lPlaceholderUserStr = -1; + m_nFormatDate = 1; - virtual CElementPtr CreateDublicate() = 0; + m_etType = etShape; - virtual void SetProperiesToDublicate(CElementPtr pDublicate) - { - if (!pDublicate) - return; + m_dStartTime = 0.0; + m_dEndTime = 30.0; - pDublicate->m_bIsBackground = m_bIsBackground; - pDublicate->m_bHaveAnchor = m_bHaveAnchor; - pDublicate->m_bHidden = m_bHidden; + m_dRotate = 0.0; + m_bFlipH = false; + m_bFlipV = false; + m_bLine = true; + m_bIsFilled = true; - pDublicate->m_etType = m_etType; - - pDublicate->m_rcChildAnchor = m_rcChildAnchor; - pDublicate->m_rcAnchor = m_rcAnchor; - pDublicate->m_rcGroupAnchor = m_rcGroupAnchor; + m_pTheme = NULL; + m_pLayout = NULL; + m_pParentElements = NULL; + } + virtual ~CElement() + { + } - pDublicate->m_bChildAnchorEnabled = m_bChildAnchorEnabled; - pDublicate->m_bAnchorEnabled = m_bAnchorEnabled; - pDublicate->m_bGroupAnchorEnabled = m_bGroupAnchorEnabled; + virtual CElementPtr CreateDublicate() = 0; - pDublicate->m_dStartTime = m_dStartTime; - pDublicate->m_dEndTime = m_dEndTime; + virtual void SetProperiesToDublicate(CElementPtr pDublicate) + { + if (!pDublicate) + return; - pDublicate->m_lID = m_lID; - pDublicate->m_lLayoutID = m_lLayoutID; + pDublicate->m_bIsBackground = m_bIsBackground; + pDublicate->m_bHaveAnchor = m_bHaveAnchor; + pDublicate->m_bHidden = m_bHidden; - pDublicate->m_arrActions = m_arrActions; - pDublicate->m_oTextActions = m_oTextActions; - pDublicate->m_oAnimations = m_oAnimations; - pDublicate->m_oEffects = m_oEffects; + pDublicate->m_etType = m_etType; - pDublicate->m_lPlaceholderID = m_lPlaceholderID; - pDublicate->m_lPlaceholderType = m_lPlaceholderType; - pDublicate->m_bPlaceholderSet = m_bPlaceholderSet; - - pDublicate->m_lPlaceholderSizePreset = m_lPlaceholderSizePreset; - pDublicate->m_lPlaceholderUserStr = m_lPlaceholderUserStr; - pDublicate->m_nFormatDate = m_nFormatDate; + pDublicate->m_rcChildAnchor = m_rcChildAnchor; + pDublicate->m_rcAnchor = m_rcAnchor; + pDublicate->m_rcGroupAnchor = m_rcGroupAnchor; - pDublicate->m_dRotate = m_dRotate; - pDublicate->m_bFlipH = m_bFlipH; - pDublicate->m_bFlipV = m_bFlipV; - pDublicate->m_bLine = m_bLine; - pDublicate->m_bIsFilled = m_bIsFilled; + pDublicate->m_bChildAnchorEnabled = m_bChildAnchorEnabled; + pDublicate->m_bAnchorEnabled = m_bAnchorEnabled; + pDublicate->m_bGroupAnchorEnabled = m_bGroupAnchorEnabled; - pDublicate->m_pTheme = m_pTheme; - pDublicate->m_pLayout = m_pLayout; - - pDublicate->m_oPen = m_oPen; - pDublicate->m_oBrush = m_oBrush; - pDublicate->m_oShadow = m_oShadow; - } + pDublicate->m_dStartTime = m_dStartTime; + pDublicate->m_dEndTime = m_dEndTime; - void NormalizeCoordsByMetric() - { - if (!m_bAnchorEnabled) return; - double dScale = 1587.5; //master to emu - - m_rcAnchor.left = dScale * m_rcAnchor.left; - m_rcAnchor.right = dScale * m_rcAnchor.right; - m_rcAnchor.top = dScale * m_rcAnchor.top; - m_rcAnchor.bottom = dScale * m_rcAnchor.bottom; - } - }; + pDublicate->m_lID = m_lID; + pDublicate->m_lLayoutID = m_lLayoutID; + + pDublicate->m_arrActions = m_arrActions; + pDublicate->m_oTextActions = m_oTextActions; + pDublicate->m_oAnimations = m_oAnimations; + pDublicate->m_oEffects = m_oEffects; + + pDublicate->m_lPlaceholderID = m_lPlaceholderID; + pDublicate->m_lPlaceholderType = m_lPlaceholderType; + pDublicate->m_bPlaceholderSet = m_bPlaceholderSet; + + pDublicate->m_lPlaceholderSizePreset = m_lPlaceholderSizePreset; + pDublicate->m_lPlaceholderUserStr = m_lPlaceholderUserStr; + pDublicate->m_nFormatDate = m_nFormatDate; + + pDublicate->m_dRotate = m_dRotate; + pDublicate->m_bFlipH = m_bFlipH; + pDublicate->m_bFlipV = m_bFlipV; + pDublicate->m_bLine = m_bLine; + pDublicate->m_bIsFilled = m_bIsFilled; + + pDublicate->m_pTheme = m_pTheme; + pDublicate->m_pLayout = m_pLayout; + + pDublicate->m_oPen = m_oPen; + pDublicate->m_oBrush = m_oBrush; + pDublicate->m_oShadow = m_oShadow; + } + + void NormalizeCoordsByMetric() + { + if (!m_bAnchorEnabled) return; + double dScale = 1587.5; //master to emu + + m_rcAnchor.left = dScale * m_rcAnchor.left; + m_rcAnchor.right = dScale * m_rcAnchor.right; + m_rcAnchor.top = dScale * m_rcAnchor.top; + m_rcAnchor.bottom = dScale * m_rcAnchor.bottom; + } +}; } diff --git a/ASCOfficePPTXFile/Editor/Drawing/Elements.h b/ASCOfficePPTXFile/Editor/Drawing/Elements.h index 6b41f8b0a9..5d05eda330 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Elements.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Elements.h @@ -32,7 +32,6 @@ #pragma once #include "Theme.h" #include "Shapes/Shape.h" - #include "Shapes/BaseShape/PPTShape/Ppt2PptxShapeConverter.h" namespace PPTX2EditorAdvanced @@ -731,7 +730,8 @@ namespace PPT_FORMAT return pElement; } }; - class CVideoElement : public CImageElement + + class CVideoElement : public CImageElement { public: std::wstring m_strVideoFileName; @@ -780,33 +780,62 @@ namespace PPT_FORMAT } }; - class CGroupElement : public CElement - { - public: - CGroupElement() : CElement() - { - m_etType = etGroup; - } - virtual ~CGroupElement() - { - } - virtual CElementPtr CreateDublicate() - { - CGroupElement* pGroupElement = new CGroupElement(); + class CGroupElement : public CElement + { + public: - CElementPtr pElement = CElementPtr( pGroupElement ); - - SetProperiesToDublicate(pElement); + public: + CGroupElement() : CElement() + { + m_etType = etGroup; + } + virtual ~CGroupElement() + { + } + virtual CElementPtr CreateDublicate() + { + CGroupElement* pGroupElement = new CGroupElement(); - return pElement; - } - AVSINLINE std::wstring ConvertPPTShapeToPPTX(bool bIsNamespace = false) - { + CElementPtr pElement = CElementPtr( pGroupElement ); - return L""; - } - }; + SetProperiesToDublicate(pElement); + return pElement; + } + AVSINLINE std::wstring ConvertPPTShapeToPPTX(bool bIsNamespace = false) + { + return L""; + } + }; + + class CTableElement : public CElement + { + public: + std::wstring m_xmlRawData; + public: + CTableElement() : CElement() + { + m_etType = etTable; + } + virtual ~CTableElement() + { + } + virtual CElementPtr CreateDublicate() + { + CTableElement* pTableElement = new CTableElement(); + + CElementPtr pElement = CElementPtr( pTableElement ); + + SetProperiesToDublicate(pElement); + + return pElement; + } + AVSINLINE std::wstring ConvertPPTShapeToPPTX(bool bIsNamespace = false) + { + + return L""; + } + }; } diff --git a/ASCOfficePPTXFile/Editor/Drawing/Interactive.h b/ASCOfficePPTXFile/Editor/Drawing/Interactive.h index e02b26e442..324687c568 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Interactive.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Interactive.h @@ -36,116 +36,123 @@ namespace PPT_FORMAT { - class CTextRange - { - public: - int m_lStart; - int m_lEnd; - - public: - CTextRange() - { - m_lStart = 0; - m_lEnd = 0; - } - CTextRange& operator=(const CTextRange& oSrc) - { - m_lStart = oSrc.m_lStart; - m_lEnd = oSrc.m_lEnd; +class CTextRange +{ +public: + int m_lStart; + int m_lEnd; - return *this; - } - CTextRange(const CTextRange& oSrc) - { - *this = oSrc; - } - }; - class CInteractiveInfo - { - public: - enum : bool - { - click, - over - }; - CInteractiveInfo() - { - m_bPresent = false; - } +public: + CTextRange() + { + m_lStart = 0; + m_lEnd = 0; + } + CTextRange& operator=(const CTextRange& oSrc) + { + m_lStart = oSrc.m_lStart; + m_lEnd = oSrc.m_lEnd; - CInteractiveInfo& operator=(const CInteractiveInfo& oSrc) - { - m_bPresent = oSrc.m_bPresent; - m_lType = oSrc.m_lType; + return *this; + } + CTextRange(const CTextRange& oSrc) + { + *this = oSrc; + } + bool inRange(const int pos)const + { + return (pos >= m_lStart && pos < m_lEnd); + } +}; +class CInteractiveInfo +{ +public: + enum : bool + { + click, + over + }; + CInteractiveInfo() + { + m_bPresent = false; + } - m_lOleVerb = oSrc.m_lOleVerb; - m_lJump = oSrc.m_lJump; - m_lHyperlinkType = oSrc.m_lHyperlinkType; - m_bAnimated = oSrc.m_bAnimated; - m_bStopSound = oSrc.m_bStopSound; - m_bCustomShowReturn = oSrc.m_bCustomShowReturn; - m_bVisited = oSrc.m_bVisited; + CInteractiveInfo& operator=(const CInteractiveInfo& oSrc) + { + m_bPresent = oSrc.m_bPresent; + m_lType = oSrc.m_lType; - m_strAudioFileName = oSrc.m_strAudioFileName; - m_strHyperlink = oSrc.m_strHyperlink; - m_strAudioName = oSrc.m_strAudioName; - m_eActivation = oSrc.m_eActivation; - return *this; - } - CInteractiveInfo(const CInteractiveInfo& oSrc) - { - *this = oSrc; - } + m_lOleVerb = oSrc.m_lOleVerb; + m_lJump = oSrc.m_lJump; + m_lHyperlinkType = oSrc.m_lHyperlinkType; + m_bAnimated = oSrc.m_bAnimated; + m_bStopSound = oSrc.m_bStopSound; + m_bCustomShowReturn = oSrc.m_bCustomShowReturn; + m_bVisited = oSrc.m_bVisited; - bool m_bPresent; + m_strAudioFileName = oSrc.m_strAudioFileName; + m_strHyperlink = oSrc.m_strHyperlink; + m_strAudioName = oSrc.m_strAudioName; + m_eActivation = oSrc.m_eActivation; + m_macro = oSrc.m_macro; + return *this; + } + CInteractiveInfo(const CInteractiveInfo& oSrc) + { + *this = oSrc; + } - int m_lType; - int m_lOleVerb; - int m_lJump; - int m_lHyperlinkType; - bool m_bAnimated; - bool m_bStopSound; - bool m_bCustomShowReturn; - bool m_bVisited; - bool m_eActivation; // Click or over + bool m_bPresent; - std::wstring m_strAudioFileName; - std::wstring m_strHyperlink; - std::wstring m_strAudioName; - }; - class CTextInteractiveInfo - { - private: - long m_lType; - ASC_VARIANT m_varParameter; - - public: - bool m_bPresent; + int m_lType; + int m_lOleVerb; + int m_lJump; + int m_lHyperlinkType; + bool m_bAnimated; + bool m_bStopSound; + bool m_bCustomShowReturn; + bool m_bVisited; + bool m_eActivation; // Click or over - std::vector m_arRanges; + std::wstring m_strAudioFileName; + std::wstring m_strHyperlink; + std::wstring m_strAudioName; + std::wstring m_macro; - CTextInteractiveInfo() - { - m_bPresent = false; - } - ~CTextInteractiveInfo() - { - } +}; +class CTextInteractiveInfo +{ +private: + long m_lType; + ASC_VARIANT m_varParameter; - CTextInteractiveInfo& operator=(const CTextInteractiveInfo& oSrc) - { - m_lType = oSrc.m_lType; - m_varParameter = oSrc.m_varParameter; +public: + bool m_bPresent; - m_bPresent = oSrc.m_bPresent; + std::vector m_arRanges; - m_arRanges.insert(m_arRanges.end(), oSrc.m_arRanges.begin(), oSrc.m_arRanges.end()); + CTextInteractiveInfo() + { + m_bPresent = false; + } + ~CTextInteractiveInfo() + { + } - return *this; - } - CTextInteractiveInfo(const CTextInteractiveInfo& oSrc) - { - *this = oSrc; - } - }; + CTextInteractiveInfo& operator=(const CTextInteractiveInfo& oSrc) + { + m_lType = oSrc.m_lType; + m_varParameter = oSrc.m_varParameter; + + m_bPresent = oSrc.m_bPresent; + + m_arRanges.insert(m_arRanges.end(), oSrc.m_arRanges.begin(), oSrc.m_arRanges.end()); + + return *this; + } + CTextInteractiveInfo(const CTextInteractiveInfo& oSrc) + { + *this = oSrc; + } +}; } diff --git a/ASCOfficePPTXFile/Editor/Drawing/TextAttributesEx.h b/ASCOfficePPTXFile/Editor/Drawing/TextAttributesEx.h index 8c5da3724a..9892db3e6b 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/TextAttributesEx.h +++ b/ASCOfficePPTXFile/Editor/Drawing/TextAttributesEx.h @@ -63,6 +63,7 @@ namespace PPT_FORMAT // настройки по-умолчанию CTextAttributes m_oAttributes; std::vector m_arParagraphs; + std::wstring m_originalText; bool m_bVertical; bool m_bAutoFit; diff --git a/ASCOfficePPTXFile/Editor/Drawing/TextStructures.h b/ASCOfficePPTXFile/Editor/Drawing/TextStructures.h index 1a9469345a..8d7f0f96d5 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/TextStructures.h +++ b/ASCOfficePPTXFile/Editor/Drawing/TextStructures.h @@ -33,6 +33,7 @@ #include "Structures.h" #include "../../../ASCOfficePPTFile/PPTFormatLib/Enums/enums.h" #include "../../../Common/DocxFormat/Source/Base/Nullable.h" +#include "../../../ASCOfficePPTXFile/Editor/Drawing/Interactive.h" using namespace ODRAW; @@ -163,7 +164,7 @@ namespace PPT_FORMAT NSCommon::nullable_base Cap; // 0 - none, 1 - TEXT, 2 - text NSCommon::nullable_base Language; - CFontProperties font; + CFontProperties font; CTextCFRun() { @@ -197,8 +198,7 @@ namespace PPT_FORMAT Cap = oSrc.Cap; - Language = oSrc.Language; - + Language = oSrc.Language; return *this; } ~CTextCFRun() @@ -637,6 +637,8 @@ namespace PPT_FORMAT bool m_bField; bool m_bBreak; + std::vector m_arrInteractive; + CSpan() : m_bField(false), m_bBreak(false) { } @@ -650,6 +652,7 @@ namespace PPT_FORMAT m_strText = oSrc.m_strText; m_bField = oSrc.m_bField; m_bBreak = oSrc.m_bBreak; + m_arrInteractive = oSrc.m_arrInteractive; return *this; } diff --git a/ASCOfficePPTXFile/Editor/Drawing/Theme.h b/ASCOfficePPTXFile/Editor/Drawing/Theme.h index 1d5d331250..4e0cf044f4 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Theme.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Theme.h @@ -30,6 +30,7 @@ * */ #pragma once +#include "../../../ASCOfficePPTFile/PPTFormatLib/Records/RoundTripThemeAtom.h" #include "Structures.h" #include "Layout.h" @@ -75,6 +76,8 @@ namespace PPT_FORMAT std::wstring m_sThemeName; std::vector>m_arExtraColorScheme; + + std::vector m_arrZipXml; bool m_bHasDate; bool m_bHasSlideNumber; @@ -101,6 +104,7 @@ namespace PPT_FORMAT m_mapTitleLayout.clear(); m_mapGeomToLayout.clear(); m_mapPlaceholders.clear(); + m_arrZipXml.clear(); m_sThemeName = L"Default"; diff --git a/ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BulletTypeface.h b/ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BulletTypeface.h index 989312ef74..a9f21b583c 100644 --- a/ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BulletTypeface.h +++ b/ASCOfficePPTXFile/PPTXFormat/Logic/Bullets/BulletTypeface.h @@ -153,8 +153,8 @@ namespace PPTX pReader->Seek(_end_rec); } - //public: - private: + public: +// private: smart_ptr m_Typeface; protected: virtual void FillParentPointersForChilds(){}; @@ -168,4 +168,4 @@ namespace PPTX } // namespace Logic } // namespace PPTX -#endif // PPTX_LOGIC_BULLETTYPEFACE_INCLUDE_H \ No newline at end of file +#endif // PPTX_LOGIC_BULLETTYPEFACE_INCLUDE_H diff --git a/ASCOfficePPTXFile/PPTXFormat/Logic/CxnSp.h b/ASCOfficePPTXFile/PPTXFormat/Logic/CxnSp.h index 4e5b635d19..9114fade55 100644 --- a/ASCOfficePPTXFile/PPTXFormat/Logic/CxnSp.h +++ b/ASCOfficePPTXFile/PPTXFormat/Logic/CxnSp.h @@ -76,14 +76,16 @@ namespace PPTX { pWriter->StartRecord(SPTREE_TYPE_CXNSP); - pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); - pWriter->WriteString2(0, macro); - pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); - pWriter->WriteRecord1(0, nvCxnSpPr); pWriter->WriteRecord1(1, spPr); pWriter->WriteRecord2(2, style); + if (macro.IsInit()) + { + pWriter->StartRecord(SPTREE_TYPE_MACRO); + pWriter->WriteString1(0, *macro); + pWriter->EndRecord(); + } pWriter->EndRecord(); } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) @@ -130,24 +132,6 @@ namespace PPTX { LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4; - pReader->Skip(1); // start attributes - - while (true) - { - BYTE _at = pReader->GetUChar_TypeNode(); - if (_at == NSBinPptxRW::g_nodeAttributeEnd) - break; - - switch (_at) - { - case 0: - { - macro = pReader->GetString2(); - }break; - default: - break; - } - } while (pReader->GetPos() < _end_rec) { BYTE _at = pReader->GetUChar(); @@ -169,6 +153,11 @@ namespace PPTX style->fromPPTY(pReader); break; } + case SPTREE_TYPE_MACRO: + { + pReader->Skip(5); // type + size + macro = pReader->GetString2(); + }break; default: { break; diff --git a/ASCOfficePPTXFile/PPTXFormat/Logic/GraphicFrame.cpp b/ASCOfficePPTXFile/PPTXFormat/Logic/GraphicFrame.cpp index 881ee2892a..849a3a7c10 100755 --- a/ASCOfficePPTXFile/PPTXFormat/Logic/GraphicFrame.cpp +++ b/ASCOfficePPTXFile/PPTXFormat/Logic/GraphicFrame.cpp @@ -596,7 +596,6 @@ namespace PPTX pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); pWriter->WriteString2(0, vmlSpid); - pWriter->WriteString2(1, macro); pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); pWriter->WriteRecord2(0, nvGraphicFramePr); @@ -637,7 +636,12 @@ namespace PPTX { //???? } - + if (macro.IsInit()) + { + pWriter->StartRecord(SPTREE_TYPE_MACRO); + pWriter->WriteString1(0, *macro); + pWriter->EndRecord(); + } pWriter->EndRecord(); } @@ -658,10 +662,6 @@ namespace PPTX { vmlSpid = pReader->GetString2(); }break; - case 1: - { - macro = pReader->GetString2(); - }break; default: break; } @@ -718,6 +718,11 @@ namespace PPTX smartArt = new Logic::SmartArt(); smartArt->fromPPTY(pReader); }break; + case SPTREE_TYPE_MACRO: + { + pReader->Skip(5); // type + size + macro = pReader->GetString2(); + }break; default: pReader->SkipRecord(); break; diff --git a/ASCOfficePPTXFile/PPTXFormat/Logic/Pic.cpp b/ASCOfficePPTXFile/PPTXFormat/Logic/Pic.cpp index ef8cedd9ba..a7db89f467 100644 --- a/ASCOfficePPTXFile/PPTXFormat/Logic/Pic.cpp +++ b/ASCOfficePPTXFile/PPTXFormat/Logic/Pic.cpp @@ -725,9 +725,6 @@ namespace PPTX { pWriter->StartRecord(SPTREE_TYPE_PIC); } - pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); - pWriter->WriteString2(0, macro); - pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); if (blipFill.additionalFile.is()) { @@ -754,6 +751,12 @@ namespace PPTX pWriter->WriteRecord1(2, spPr); pWriter->WriteRecord2(3, style); + if (macro.IsInit()) + { + pWriter->StartRecord(SPTREE_TYPE_MACRO); + pWriter->WriteString1(0, *macro); + pWriter->EndRecord(); + } pWriter->EndRecord(); } @@ -850,24 +853,6 @@ namespace PPTX LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4; nvPicPr.cNvPr.id = -1; - pReader->Skip(1); // start attributes - - while (true) - { - BYTE _at = pReader->GetUChar_TypeNode(); - if (_at == NSBinPptxRW::g_nodeAttributeEnd) - break; - - switch (_at) - { - case 0: - { - macro = pReader->GetString2(); - }break; - default: - break; - } - } while (pReader->GetPos() < _end_rec) { @@ -954,6 +939,11 @@ namespace PPTX } pReader->Seek(_end_rec1); } + case SPTREE_TYPE_MACRO: + { + pReader->Skip(5); // type + size + macro = pReader->GetString2(); + }break; default: { break; diff --git a/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.cpp b/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.cpp index 158bd4b8ee..5b4b232166 100644 --- a/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.cpp +++ b/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.cpp @@ -149,9 +149,8 @@ namespace PPTX { m_name = node.GetName(); - XmlMacroReadAttributeBase(node,L"useBgFill", attrUseBgFill); - XmlMacroReadAttributeBase(node, L"macro", attrMacro); - XmlMacroReadAttributeBase(node, L"modelId", attrModelId); + XmlMacroReadAttributeBase(node,L"useBgFill", useBgFill); + XmlMacroReadAttributeBase(node, L"modelId", modelId); XmlUtils::CXmlNodes oNodes; if (node.GetNodes(L"*", oNodes)) @@ -192,9 +191,9 @@ namespace PPTX std::wstring Shape::toXML() const { XmlUtils::CAttribute oAttr; - oAttr.Write(L"useBgFill", attrUseBgFill); - oAttr.Write(L"macro", attrMacro); - oAttr.Write(L"modelId", attrModelId); + + oAttr.Write(L"useBgFill", useBgFill); + oAttr.Write(L"modelId", modelId); XmlUtils::CNodeValue oValue; oValue.Write(nvSpPr); @@ -221,9 +220,10 @@ namespace PPTX pWriter->StartNode(name_); pWriter->StartAttributes(); - pWriter->WriteAttribute(L"macro", attrMacro); - pWriter->WriteAttribute(L"useBgFill", attrUseBgFill); - pWriter->WriteAttribute(L"modelId", attrModelId); + + pWriter->WriteAttribute(L"useBgFill", useBgFill); + pWriter->WriteAttribute(L"modelId", modelId); + pWriter->EndAttributes(); if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX || @@ -338,15 +338,11 @@ namespace PPTX { case 0: { - attrUseBgFill = pReader->GetBool(); - }break; - case 1: - { - attrMacro = pReader->GetString2(); + useBgFill = pReader->GetBool(); }break; case 2: { - attrModelId = pReader->GetString2(); + modelId = pReader->GetString2(); }break; default: break; @@ -425,6 +421,11 @@ namespace PPTX signatureLine->fromPPTY(pReader); break; } + case SPTREE_TYPE_MACRO: + { + pReader->Skip(5); // type + size + macro = pReader->GetString2(); + }break; default: { pReader->SkipRecord(); @@ -435,6 +436,10 @@ namespace PPTX pReader->Seek(_end_rec); } +<<<<<<< HEAD +======= + +>>>>>>> origin/release/v6.4.0 void Shape::FillParentPointersForChilds() { nvSpPr.SetParentPointer(this); @@ -450,9 +455,10 @@ namespace PPTX pWriter->StartRecord(SPTREE_TYPE_SHAPE); pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); - pWriter->WriteBool2(0, attrUseBgFill); - pWriter->WriteString2(1, attrMacro); - pWriter->WriteString2(2, attrModelId); + + pWriter->WriteBool2(0, useBgFill); + pWriter->WriteString2(2, modelId); + pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); pWriter->WriteRecord1(0, nvSpPr); @@ -519,6 +525,12 @@ namespace PPTX pWriter->WriteRecord2(6, txXfrm); pWriter->WriteRecord2(7, signatureLine); + if (macro.IsInit()) + { + pWriter->StartRecord(SPTREE_TYPE_MACRO); + pWriter->WriteString1(0, *macro); + pWriter->EndRecord(); + } pWriter->EndRecord(); } diff --git a/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.h b/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.h index ec56a24956..b9f76649ef 100644 --- a/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.h +++ b/ASCOfficePPTXFile/PPTXFormat/Logic/Shape.h @@ -296,12 +296,13 @@ namespace PPTX void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, _T("useBgFill"), attrUseBgFill) - WritingElement_ReadAttributes_Read_else_if(oReader, _T("macro"), attrMacro) - WritingElement_ReadAttributes_Read_else_if(oReader, _T("modelId"), attrModelId) + WritingElement_ReadAttributes_Read_if( oReader, _T("useBgFill"), useBgFill) + WritingElement_ReadAttributes_Read_else_if(oReader, _T("macro"), macro) + WritingElement_ReadAttributes_Read_else_if(oReader, _T("modelId"), modelId) WritingElement_ReadAttributes_End( oReader ) + } - std::wstring GetText()const{if(txBody.IsInit()) return txBody->GetText(); return _T(""); }; + std::wstring GetText()const{if(txBody.IsInit()) return txBody->GetText(); return L""; }; void FillLevelUp(); void Merge(Shape& shape, bool bIsSlidePlaceholder = false); @@ -332,9 +333,10 @@ namespace PPTX nullable oTextBoxShape; nullable oTextBoxBodyPr; - nullable_bool attrUseBgFill; - nullable_string attrMacro; - nullable_string attrModelId; + + nullable_string modelId; + nullable_bool useBgFill; + nullable_string macro; //------------------------------------------------------------------------------------------------- nullable signatureLine; std::wstring m_sClientDataXml; diff --git a/ASCOfficePPTXFile/PPTXFormat/Logic/Sp3d.h b/ASCOfficePPTXFile/PPTXFormat/Logic/Sp3d.h index b22c2f9170..94f24bda42 100644 --- a/ASCOfficePPTXFile/PPTXFormat/Logic/Sp3d.h +++ b/ASCOfficePPTXFile/PPTXFormat/Logic/Sp3d.h @@ -185,13 +185,19 @@ namespace PPTX pWriter->WriteInt2(1, extrusionH); pWriter->WriteLimit2(2, prstMaterial); pWriter->WriteInt2(3, z); - pWriter->WriteString2(4, macro); pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); pWriter->WriteRecord2(0, bevelT); pWriter->WriteRecord2(1, bevelB); pWriter->WriteRecord1(2, extrusionClr); pWriter->WriteRecord1(3, contourClr); + + if (macro.IsInit()) + { + pWriter->StartRecord(SPTREE_TYPE_MACRO); + pWriter->WriteString1(0, *macro); + pWriter->EndRecord(); + } } virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) { @@ -209,7 +215,6 @@ namespace PPTX else if (1 == _at) extrusionH = pReader->GetLong(); else if (2 == _at) prstMaterial = pReader->GetUChar(); else if (3 == _at) z = pReader->GetLong(); - else if (4 == _at) macro = pReader->GetString2(); else break; } @@ -241,11 +246,15 @@ namespace PPTX contourClr.fromPPTY(pReader); break; } + case SPTREE_TYPE_MACRO: + { + pReader->Skip(5); // type + size + macro = pReader->GetString2(); + }break; default: break; } } - pReader->Seek(_end_rec); } diff --git a/ASCOfficePPTXFile/PPTXFormat/WrapperWritingElement.h b/ASCOfficePPTXFile/PPTXFormat/WrapperWritingElement.h index aa63667dfd..e46fa4bb50 100644 --- a/ASCOfficePPTXFile/PPTXFormat/WrapperWritingElement.h +++ b/ASCOfficePPTXFile/PPTXFormat/WrapperWritingElement.h @@ -76,7 +76,8 @@ namespace PPTX virtual void FillParentPointersForChilds(){} public: - virtual void SetParentPointer(const WrapperWritingElement* pParent) + virtual void + SetParentPointer(const WrapperWritingElement* pParent) { parentElement = pParent; parentFile = parentElement->parentFile; diff --git a/Common/DocxFormat/Projects/DocxFormatLib.vcxproj b/Common/DocxFormat/Projects/DocxFormatLib.vcxproj index 19ac504e9d..4bdb9ce7ea 100644 --- a/Common/DocxFormat/Projects/DocxFormatLib.vcxproj +++ b/Common/DocxFormat/Projects/DocxFormatLib.vcxproj @@ -406,6 +406,7 @@ + diff --git a/Common/DocxFormat/Projects/DocxFormatLib.vcxproj.filters b/Common/DocxFormat/Projects/DocxFormatLib.vcxproj.filters index 0503f58dd3..da24b6c993 100644 --- a/Common/DocxFormat/Projects/DocxFormatLib.vcxproj.filters +++ b/Common/DocxFormat/Projects/DocxFormatLib.vcxproj.filters @@ -121,9 +121,6 @@ {1be492b6-dbf2-436f-be99-b8ce8cd99269} - - {ebf55a86-a27b-4d5d-a95b-1f9cbc890855} - {c6fe581a-01db-4119-9bbc-1dfdc7e376ed} @@ -165,6 +162,9 @@ {da1b6ba4-f567-4fa5-afe5-ba031ec0ad29} + + + {ebf55a86-a27b-4d5d-a95b-1f9cbc890855} @@ -481,37 +481,37 @@ XlsxFormat\SharedStrings - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles - XlsxFormat\Styles + XlsxFormat\Slicer\Styles XlsxFormat\Table @@ -694,6 +694,7 @@ XlsxFormat\Chart +<<<<<<< HEAD Diagram @@ -708,6 +709,10 @@ Diagram +======= + + XlsxFormat\Worksheets +>>>>>>> origin/release/v6.4.0 @@ -826,7 +831,7 @@ XlsxFormat\SharedStrings - XlsxFormat\Styles + XlsxFormat\Slicer\Styles XlsxFormat\Table diff --git a/Common/DocxFormat/Source/DocxFormat/Logic/Sdt.cpp b/Common/DocxFormat/Source/DocxFormat/Logic/Sdt.cpp index 73492449ce..88ad4f3cec 100644 --- a/Common/DocxFormat/Source/DocxFormat/Logic/Sdt.cpp +++ b/Common/DocxFormat/Source/DocxFormat/Logic/Sdt.cpp @@ -55,59 +55,6 @@ namespace ComplexTypes { namespace Word { - void CFormPr::FromXML(XmlUtils::CXmlNode& oNode) - { - XmlMacroReadAttributeBase( oNode, L"w:key", m_oKey ); - XmlMacroReadAttributeBase( oNode, L"w:label", m_oLabel ); - XmlMacroReadAttributeBase( oNode, L"w:helpText", m_oHelpText ); - XmlMacroReadAttributeBase( oNode, L"w:required", m_oRequired ); - } - void CFormPr::FromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); - - if ( !oReader.IsEmptyNode() ) - oReader.ReadTillEnd(); - } - std::wstring CFormPr::ToString() const - { - std::wstring sResult; - if(m_oKey.IsInit()) - { - sResult += L"w:key=\"" + XmlUtils::EncodeXmlString(m_oKey.get()) + L"\" "; - } - if(m_oLabel.IsInit()) - { - sResult += L"w:label=\"" + XmlUtils::EncodeXmlString(m_oLabel.get()) + L"\" "; - } - if(m_oHelpText.IsInit()) - { - sResult += L"w:helpText=\"" + XmlUtils::EncodeXmlString(m_oHelpText.get()) + L"\" "; - } - if(m_oRequired.IsInit()) - { - if(*m_oRequired) - { - sResult += L"w:required=\"1\" "; - } - else - { - sResult += L"w:required=\"0\" "; - } - - } - - return sResult; - } - void CFormPr::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start_No_NS( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, L"key", m_oKey ) - WritingElement_ReadAttributes_Read_else_if( oReader, L"label", m_oLabel ) - WritingElement_ReadAttributes_Read_else_if( oReader, L"helpText", m_oHelpText ) - WritingElement_ReadAttributes_Read_else_if( oReader, L"required", m_oRequired ) - WritingElement_ReadAttributes_End_No_NS( oReader ) - } void CComb::FromXML(XmlUtils::CXmlNode& oNode) { XmlMacroReadAttributeBase( oNode, L"w:width", m_oWidth ); @@ -154,9 +101,9 @@ namespace OOX { namespace Logic { - //-------------------------------------------------------------------------------- - // CSdtContent - //-------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------- +// CSdtContent +//-------------------------------------------------------------------------------- void CSdtContent::fromXML(XmlUtils::CXmlNode& oNode) { ClearItems(); @@ -364,6 +311,87 @@ namespace OOX return sResult; } +//-------------------------------------------------------------------------------- + EElementType CFormPr::getType() const + { + return et_w_formPr; + } + void CFormPr::fromXML(XmlUtils::CXmlNode& oNode) + { + XmlUtils::CXmlNode oChild; + + XmlMacroReadAttributeBase(oNode, L"w:key", m_oKey); + XmlMacroReadAttributeBase(oNode, L"w:label", m_oLabel); + XmlMacroReadAttributeBase(oNode, L"w:helpText", m_oHelpText); + XmlMacroReadAttributeBase(oNode, L"w:required", m_oRequired); + + WritingElement_ReadNode(oNode, oChild, L"w:border", m_oBorder); + WritingElement_ReadNode(oNode, oChild, L"w:shd", m_oShd); + } + void CFormPr::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nParentDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nParentDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"w:shd" == sName) + m_oShd = oReader; + else if (L"w:border" == sName) + m_oBorder = oReader; + } + } + std::wstring CFormPr::toXML() const + { + std::wstring sResult = L""; + WritingElement_WriteNode_1(L""; + + return sResult; + + return sResult; + } + void CFormPr::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start_No_NS(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"key", m_oKey) + WritingElement_ReadAttributes_Read_else_if(oReader, L"label", m_oLabel) + WritingElement_ReadAttributes_Read_else_if(oReader, L"helpText", m_oHelpText) + WritingElement_ReadAttributes_Read_else_if(oReader, L"required", m_oRequired) + WritingElement_ReadAttributes_End_No_NS(oReader) + } //----------------------------------------------------------------------------------------------------------------------------- void CTextFormPr::fromXML(XmlUtils::CXmlNode& oNode) { @@ -739,7 +767,7 @@ namespace OOX break; } } - WritingElement_WriteNode_1(L"> m_oVal; }; - //Not from specification - class CFormPr : public ComplexType - { - public: - ComplexTypes_AdditionConstructors(CFormPr) - CFormPr() - { - } - virtual ~CFormPr() - { - } - - virtual void FromXML(XmlUtils::CXmlNode& oNode); - virtual void FromXML(XmlUtils::CXmlLiteReader& oReader); - virtual std::wstring ToString() const; - private: - - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - - public: - - nullable_string m_oKey; - nullable_string m_oLabel; - nullable_string m_oHelpText; - nullable_bool m_oRequired; - }; //Not from specification class CComb : public ComplexType { @@ -462,6 +436,32 @@ namespace OOX { namespace Logic { + //Not from specification + class CFormPr : public WritingElement + { + public: + WritingElement_AdditionConstructors(CFormPr) + CFormPr(OOX::Document *pMain = NULL) : WritingElement(pMain) + { + } + virtual ~CFormPr() + { + } + virtual void fromXML(XmlUtils::CXmlNode& oNode); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual std::wstring toXML() const; + virtual EElementType getType() const; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable_string m_oKey; + nullable_string m_oLabel; + nullable_string m_oHelpText; + nullable_bool m_oRequired; + + nullable m_oBorder; + nullable m_oShd; + }; //Not from specification class CTextFormPr : public WritingElement { @@ -1160,7 +1160,7 @@ namespace OOX nullable m_oText; nullable m_oCheckbox; - nullable m_oFormPr; //Not from specification + nullable m_oFormPr; //Not from specification nullable m_oTextFormPr; //Not from specification nullable m_oPicture; //Not from specification }; diff --git a/Common/DocxFormat/Source/DocxFormat/WritingElement.h b/Common/DocxFormat/Source/DocxFormat/WritingElement.h index 8cd8f4999c..52a73754bd 100644 --- a/Common/DocxFormat/Source/DocxFormat/WritingElement.h +++ b/Common/DocxFormat/Source/DocxFormat/WritingElement.h @@ -774,6 +774,7 @@ namespace OOX et_w_cols, // et_w_comboBox, // et_w_textFormPr, // custom! + et_w_formPr,// custom! et_w_comment, // et_w_commentRangeEnd, // et_w_commentRangeStart, // diff --git a/Common/DocxFormat/Source/SystemUtility/File.h b/Common/DocxFormat/Source/SystemUtility/File.h index 9fead48763..c4038866b0 100644 --- a/Common/DocxFormat/Source/SystemUtility/File.h +++ b/Common/DocxFormat/Source/SystemUtility/File.h @@ -111,6 +111,18 @@ private: return hRes; } + + // Todo for windows =) + HRESULT _Remove(const std::wstring& strFileName) + { + BYTE* pUtf8 = NULL; + LONG lLen = 0; + NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strFileName.c_str(), strFileName.length(), pUtf8, lLen, false); + auto err = remove((char*)pUtf8); + + return S_OK; + } + public: CFile() { @@ -198,6 +210,10 @@ public: { return _Open(strFileName, false, true, true); } + HRESULT RemoveFile(const std::wstring& strFileName) + { + return _Remove(strFileName); + } HRESULT SetPosition( ULONG nPos ) { if (m_pFile && nPos <= (ULONG)m_lFileSize) diff --git a/Common/DocxFormat/Source/XlsxFormat/Worksheets/Sparkline.h b/Common/DocxFormat/Source/XlsxFormat/Worksheets/Sparkline.h index 8e1011a9de..41b392d4e5 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Worksheets/Sparkline.h +++ b/Common/DocxFormat/Source/XlsxFormat/Worksheets/Sparkline.h @@ -65,13 +65,13 @@ namespace OOX if(m_oRef.IsInit()) { writer.WriteString(_T("")); - writer.WriteString(m_oRef.get()); + writer.WriteEncodeXmlString(m_oRef.get()); writer.WriteString(_T("")); } if(m_oSqRef.IsInit()) { writer.WriteString(_T("")); - writer.WriteString(m_oSqRef.get()); + writer.WriteEncodeXmlString(m_oSqRef.get()); writer.WriteString(_T("")); } writer.WriteString(_T("")); diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index 69e432cf66..6da9d8b499 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -396,6 +396,8 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring & _fileName) } //----------------------------------------------------------------------------------------------- // others + + bool bEmptyFile = false; { NSFile::CFileBinary file; if (!file.OpenFile(fileName)) @@ -408,6 +410,8 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring & _fileName) file.ReadFile(buffer, MIN_SIZE_BUFFER, dwReadBytes); int sizeRead = (int)dwReadBytes; + bEmptyFile = (dwReadBytes < 1); + if ( isOOXFlatFormatFile(buffer,sizeRead) ) { //nFileType; @@ -469,7 +473,7 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring & _fileName) if (buffer)delete []buffer; buffer = NULL; } - if (nFileType != AVS_OFFICESTUDIO_FILE_UNKNOWN)return true; + if (nFileType != AVS_OFFICESTUDIO_FILE_UNKNOWN) return true; //------------------------------------------------------------------------------------------------ //// by Extension @@ -480,10 +484,28 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring & _fileName) sExt = fileName.substr(nExtPos); std::transform(sExt.begin(), sExt.end(), sExt.begin(), tolower); - - if (0 == sExt.compare(L".mht")) + + if (nFileType != AVS_OFFICESTUDIO_FILE_UNKNOWN) return true; + + if (bEmptyFile) + { + if (0 == sExt.compare(L".xlsx")) + nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX; + else if ( 0 == sExt.compare(L".docx")) + nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX; + else if (0 == sExt.compare(L".pptx")) + nFileType = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX; + + else if (0 == sExt.compare(L".ods")) + nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS; + else if (0 == sExt.compare(L".odt")) + nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT; + else if (0 == sExt.compare(L".odp")) + nFileType = AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP; + } + else if (0 == sExt.compare(L".mht")) nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT; - else if (0 == sExt.compare(L".csv")) + else if (0 == sExt.compare(L".csv") || 0 == sExt.compare(L".xlsx") || 0 == sExt.compare(L".xls")) nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV; else if (0 == sExt.compare(L".html") || 0 == sExt.compare(L".htm")) nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML; diff --git a/Common/base.pri b/Common/base.pri index c1cae56ff6..c20502723f 100644 --- a/Common/base.pri +++ b/Common/base.pri @@ -322,6 +322,10 @@ plugin { } } +core_disable_all_warnings { + CONFIG += warn_off +} + # BUILD_PATHS # MUST BE DEFINED CORE_ROOT_DIR !core_no_dst { diff --git a/DesktopEditor/Word_Api/Editor_Defines.h b/DesktopEditor/Word_Api/Editor_Defines.h index 2e28587665..31198c7df7 100644 --- a/DesktopEditor/Word_Api/Editor_Defines.h +++ b/DesktopEditor/Word_Api/Editor_Defines.h @@ -782,6 +782,7 @@ #define ASC_MENU_EVENT_TYPE_COLOR_SCHEMES 2404 // CAscColorSchemes #define ASC_MENU_EVENT_TYPE_CHANGE_COLOR_SCHEME 2415 // SET(int) #define ASC_MENU_EVENT_TYPE_GET_COLOR_SCHEME 2416 // GET(int) +#define ASC_MENU_EVENT_TYPE_THEMECOLORS 2417 #define ASC_MENU_EVENT_TYPE_GO_TO_INTERNAL_LINK 5000 diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h b/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h index 61516b09fb..460a2ba337 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h +++ b/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h @@ -192,8 +192,8 @@ namespace MetaFile if (!pFont) return; - UpdateClip(); UpdateTransform(iGraphicsMode); + UpdateClip(); int lLogicalFontHeight = pFont->GetHeight(); if (lLogicalFontHeight < 0) diff --git a/PdfReader/Src/JBIG2Stream.cpp b/PdfReader/Src/JBIG2Stream.cpp index 13b760c07f..3331bfed99 100644 --- a/PdfReader/Src/JBIG2Stream.cpp +++ b/PdfReader/Src/JBIG2Stream.cpp @@ -3182,7 +3182,8 @@ namespace PdfReader } if (bLtp) { - pBitmap->DuplicateRow(nY, nY - 1); + if (nY > 0) + pBitmap->DuplicateRow(nY, nY - 1); continue; } } diff --git a/PdfReader/Src/SecurityHandler.cpp b/PdfReader/Src/SecurityHandler.cpp index 72db2f49ae..d5020bef92 100644 --- a/PdfReader/Src/SecurityHandler.cpp +++ b/PdfReader/Src/SecurityHandler.cpp @@ -151,7 +151,7 @@ namespace PdfReader if (oCryptCurFilter.DictLookup("Length", &oCFLength)->IsInt()) { // Согласно спецификации, должно быть oCFLength / 8 - m_nFileKeyLength = oCFLength.GetInt(); + m_nFileKeyLength = oCFLength.GetInt() / 8; } oCFLength.Free(); @@ -265,4 +265,4 @@ namespace PdfReader } return true; } -} \ No newline at end of file +} diff --git a/PdfReader/Src/XRef.cpp b/PdfReader/Src/XRef.cpp index 0fa33f6dcf..3459d19103 100644 --- a/PdfReader/Src/XRef.cpp +++ b/PdfReader/Src/XRef.cpp @@ -229,6 +229,8 @@ namespace PdfReader { m_oCS.InitializeCriticalSection(); + m_arrDecryptKey = NULL; + m_bValidXref = true; m_eErrorCode = errorNone; m_nEntrySize = 0; @@ -314,6 +316,9 @@ namespace PdfReader delete m_pObjectStream; } + if (NULL != m_arrDecryptKey) + MemUtilsFree(m_arrDecryptKey); + m_oCS.DeleteCriticalSection(); } @@ -926,6 +931,10 @@ namespace PdfReader m_bOwnerPassword = bOwnerPassword; m_nKeyLength = nKeyLength; + if (NULL != m_arrDecryptKey) + MemUtilsFree(m_arrDecryptKey); + m_arrDecryptKey = (unsigned char*)MemUtilsMalloc(m_nKeyLength); + for (int nIndex = 0; nIndex < m_nKeyLength; ++nIndex) { m_arrDecryptKey[nIndex] = sDecryptKey[nIndex]; diff --git a/PdfReader/Src/XRef.h b/PdfReader/Src/XRef.h index 03bedf285d..55da215318 100644 --- a/PdfReader/Src/XRef.h +++ b/PdfReader/Src/XRef.h @@ -181,7 +181,7 @@ namespace PdfReader bool m_bEncrypted; // Поток зашифрован или нет? int m_nPermissionFlags; // Различные ограничения bool m_bOwnerPassword; // Проверяем правильный ли был введен пароль владельца файла - unsigned char m_arrDecryptKey[32]; // Ключ для расшифровки + unsigned char* m_arrDecryptKey; // Ключ для расшифровки int m_nKeyLength; // Размер ключа в байтах int m_nEncryptVersion; // Версия шифровки CryptAlgorithm m_eEncryptAlgorithm; // Алгоритм шифрования diff --git a/PdfWriter/PdfRenderer.cpp b/PdfWriter/PdfRenderer.cpp index 485e82de02..28b327bc96 100644 --- a/PdfWriter/PdfRenderer.cpp +++ b/PdfWriter/PdfRenderer.cpp @@ -365,6 +365,7 @@ void CPdfRenderer::CCommandManager::Flush() ETextRenderingMode eMode = textrenderingmode_Fill; bool isNeedDoBold = false; bool isNeedDoItalic = false; + double dLineWidth = -1; double dPrevX = -1000; double dPrevY = -1000; @@ -416,9 +417,20 @@ void CPdfRenderer::CCommandManager::Flush() isNeedDoBold = pText->IsNeedDoBold(); if (isNeedDoBold && eMode == textrenderingmode_Fill) + { + double dNewLineWidth = dTextSize / 12 * 0.343; + if (fabs(dLineWidth - dNewLineWidth) > 0.001) + { + dLineWidth = dNewLineWidth; + pPage->SetLineWidth(dLineWidth); + } + pPage->SetTextRenderingMode(textrenderingmode_FillThenStroke); + } else + { pPage->SetTextRenderingMode(eMode); + } } if (fabs(dHorScaling - pText->GetHorScaling()) > 0.001) @@ -457,8 +469,8 @@ void CPdfRenderer::CCommandManager::Flush() } } } - oTextLine.Flush(pPage); + oTextLine.Flush(pPage); pPage->EndText(); } diff --git a/PdfWriter/Src/Utils.h b/PdfWriter/Src/Utils.h index 65974e12ae..4e564976c6 100644 --- a/PdfWriter/Src/Utils.h +++ b/PdfWriter/Src/Utils.h @@ -34,12 +34,12 @@ #include "Types.h" -#define NEEDS_ESCAPE(c) (c < 0x20 || \ +#define NEEDS_ESCAPE(c) (c < 0x21 || \ c > 0x7e || \ c == '\\' || \ c == '%' || \ c == '#' || \ - /*c == '/' || */\ + c == '/' || \ c == '(' || \ c == ')' || \ c == '<' || \ diff --git a/X2tConverter/build/Qt/X2tConverter.pri b/X2tConverter/build/Qt/X2tConverter.pri index 324c1d950e..1507627093 100755 --- a/X2tConverter/build/Qt/X2tConverter.pri +++ b/X2tConverter/build/Qt/X2tConverter.pri @@ -91,7 +91,9 @@ LIBS += -L$$CORE_BUILDS_LIBRARIES_PATH -lDocxFormatLib LIBS += -L$$CORE_BUILDS_LIBRARIES_PATH -lCryptoPPLib #All dynamic libs -ADD_DEPENDENCY(graphics, kernel, UnicodeConverter, kernel_network, PdfWriter, PdfReader, HtmlFile2, EpubFile, XpsFile, DjVuFile, HtmlRenderer, doctrenderer, Fb2File) + +ADD_DEPENDENCY(graphics, kernel, UnicodeConverter, kernel_network, Fb2File, PdfWriter, PdfReader, HtmlFile2, EpubFile, XpsFile, DjVuFile, HtmlRenderer, doctrenderer) + ##################################################### # внешнее подключение сторонних библиотек diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index d3d048e798..bca279acb5 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -99,6 +99,31 @@ namespace NExtractTools } return sExt; } + bool create_if_empty(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &signature) + { + bool res = false; + NSFile::CFileBinary file; + if (file.OpenFile(sFrom)) + { + long file_size = file.GetFileSize(); + file.CloseFile(); + + if (file_size == 0) + { + file.CreateFileW(sTo); + + if (false == signature.empty()) + { + file.WriteStringUTF8(signature); + } + file.CloseFile(); + + res = true; + } + } + return res; + } + _UINT32 replaceContentType(const std::wstring &sDir, const std::wstring &sCTFrom, const std::wstring &sCTTo) { _UINT32 nRes = 0; @@ -231,7 +256,6 @@ namespace NExtractTools // docx -> bin _UINT32 docx2doct_bin (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) { - // Extract docx to temp directory std::wstring sTempUnpackedDOCX = sTemp + FILE_SEPARATOR_STR + _T("docx_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedDOCX); @@ -246,11 +270,14 @@ namespace NExtractTools if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_OFFCRYPTO) return mscrypt2oot_bin(sFrom, sTo, sTemp, params); else - return AVS_FILEUTILS_ERROR_CONVERT; + { + if (create_if_empty(sFrom, sTo, L"DOCY;v10;0;")) + return 0; + } + return AVS_FILEUTILS_ERROR_CONVERT; } else return AVS_FILEUTILS_ERROR_CONVERT; } - return docx_dir2doct_bin(sTempUnpackedDOCX, sTo, sTemp, params); } _UINT32 docx_dir2doct_bin (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) @@ -660,6 +687,8 @@ namespace NExtractTools } else { + if (create_if_empty(sFrom, sTo, L"XLSY;v10;0;")) + return 0; return AVS_FILEUTILS_ERROR_CONVERT; } } @@ -1060,7 +1089,11 @@ namespace NExtractTools if (OfficeFileFormatChecker.nFileType == AVS_OFFICESTUDIO_FILE_OTHER_MS_OFFCRYPTO) return mscrypt2oot_bin(sFrom, sTo, sTemp, params); else + { + if (create_if_empty(sFrom, sTo, L"PPTY;v10;0;")) + return 0; return AVS_FILEUTILS_ERROR_CONVERT; + } } else return AVS_FILEUTILS_ERROR_CONVERT; } @@ -1229,7 +1262,11 @@ namespace NExtractTools m_oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); m_oCXlsxSerializer.setFontDir(params.getFontPath()); - _UINT32 nRes = m_oCXlsxSerializer.saveToFile (sResultXlstFileEditor, sCSV, params.getXmlOptions()); + if (!params.m_nFormatFrom) params.m_nFormatFrom = new int(AVS_OFFICESTUDIO_FILE_UNKNOWN); + if (AVS_OFFICESTUDIO_FILE_UNKNOWN == *params.m_nFormatFrom) + *params.m_nFormatFrom = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV; + + _UINT32 nRes = m_oCXlsxSerializer.saveToFile (sResultXlstFileEditor, sCSV, params.getXmlOptions()); if (SUCCEEDED_X2T(nRes)) { @@ -2642,21 +2679,30 @@ namespace NExtractTools NSDirectory::CreateDirectory(sTempUnpackedOdf); - COfficeUtils oCOfficeUtils(NULL); - if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) - return -3; + _UINT32 nRes = 0; - NSDirectory::CreateDirectory(sTempUnpackedOox); - - _UINT32 nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTempUnpackedOox, params.getFontPath(), sTemp, params.getPassword(), NULL); - nRes = processEncryptionError(nRes, sFrom, params); - if(SUCCEEDED_X2T(nRes)) + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) { - BinDocxRW::CDocxSerializer m_oCDocxSerializer; + NSDirectory::CreateDirectory(sTempUnpackedOox); - m_oCDocxSerializer.setFontDir(params.getFontPath()); + nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTempUnpackedOox, params.getFontPath(), sTemp, params.getPassword(), NULL); + nRes = processEncryptionError(nRes, sFrom, params); + if (SUCCEEDED_X2T(nRes)) + { + //???? todooo - xlsx, pptx + BinDocxRW::CDocxSerializer m_oCDocxSerializer; - nRes = m_oCDocxSerializer.saveToFile (sTo, sTempUnpackedOox, params.getXmlOptions(), sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + m_oCDocxSerializer.setFontDir(params.getFontPath()); + + nRes = m_oCDocxSerializer.saveToFile(sTo, sTempUnpackedOox, params.getXmlOptions(), sTemp) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + if (create_if_empty(sFrom, sTo, L"DOCY;v10;0;")) + nRes = 0; } return nRes; } @@ -2667,7 +2713,7 @@ namespace NExtractTools COfficeUtils oCOfficeUtils(NULL); if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) - return AVS_FILEUTILS_ERROR_CONVERT;; + return AVS_FILEUTILS_ERROR_CONVERT; _UINT32 nRes = ConvertOTF2ODF(sTempUnpackedOdf); if(SUCCEEDED_X2T(nRes)) @@ -2677,32 +2723,44 @@ namespace NExtractTools } return nRes; } - _UINT32 odf2oox(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring & sTemp, InputParams& params) { std::wstring sTempUnpackedOox = sTemp + FILE_SEPARATOR_STR + _T("oox_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedOox); - _UINT32 nRes = odf2oox_dir(sFrom, sTempUnpackedOox, sTemp, params); - if(SUCCEEDED_X2T(nRes)) - { + _UINT32 nRes = odf2oox_dir(sFrom, sTempUnpackedOox, sTemp, params); + + if (SUCCEEDED_X2T(nRes)) + { COfficeUtils oCOfficeUtils(NULL); nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedOox, sTo, true)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + if (create_if_empty(sFrom, sTo, L"")) + nRes = 0; + } return nRes; } _UINT32 odf2oox_dir(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring & sTemp, InputParams& params) { + _UINT32 nRes = 0; + std::wstring sTempUnpackedOdf = sTemp + FILE_SEPARATOR_STR + _T("odf_unpacked"); NSDirectory::CreateDirectory(sTempUnpackedOdf); COfficeUtils oCOfficeUtils(NULL); - if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) - return AVS_FILEUTILS_ERROR_CONVERT;; - - _UINT32 nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTo, params.getFontPath(), sTemp, params.getPassword(), NULL); - nRes = processEncryptionError(nRes, sFrom, params); - return nRes; + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOdf, NULL, 0)) + { + nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTo, params.getFontPath(), sTemp, params.getPassword(), NULL); + nRes = processEncryptionError(nRes, sFrom, params); + } + else + { + nRes = AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; } //odf flat _UINT32 odf_flat2oot(const std::wstring &sFrom, const std::wstring &sTo, const std::wstring & sTemp, InputParams& params) diff --git a/XlsxSerializerCom/Common/BinReaderWriterDefines.h b/XlsxSerializerCom/Common/BinReaderWriterDefines.h index 626814e011..76d4ce7b28 100755 --- a/XlsxSerializerCom/Common/BinReaderWriterDefines.h +++ b/XlsxSerializerCom/Common/BinReaderWriterDefines.h @@ -143,7 +143,7 @@ namespace BinXlsxRW Aligment = 13, Protection = 14 };} - namespace c_oSerProtectionTypes {enum c_oSerAligmentTypes + namespace c_oSerProtectionTypes {enum c_oSerProtectionTypes { Hidden = 0, Locked = 1