diff --git a/ASCOfficeOdfFileW/source/OdfFormat.vcproj b/ASCOfficeOdfFileW/source/OdfFormat.vcproj
index 8ba62913d3..e156c23610 100644
--- a/ASCOfficeOdfFileW/source/OdfFormat.vcproj
+++ b/ASCOfficeOdfFileW/source/OdfFormat.vcproj
@@ -1291,6 +1291,10 @@
RelativePath=".\ReadMe.txt"
>
+
+
diff --git a/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp b/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp
index 9df7e49861..ee8827d8e0 100644
--- a/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp
+++ b/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp
@@ -48,7 +48,7 @@ namespace odf
class odf_chart_context::Impl
{
public:
- Impl(odf_conversion_context *odf_context) :odf_context_(odf_context), drawing_context_(odf_context), text_context_(odf_context)
+ Impl(odf_conversion_context *odf_context) :odf_context_(odf_context)/*, drawing_context_(odf_context)*/, text_context_(odf_context)
{
styles_context_ = NULL;
@@ -62,12 +62,10 @@ public:
odf_style_context *styles_context_;
odf_conversion_context *odf_context_;
- odf_drawing_context drawing_context_; //для заполения графических стилей объектов чарта
odf_text_context text_context_;
style_chart_properties *current_chart_properties;
chart_chart *current_chart_;
-
};
////////////////////////////////////////////////////////////////////////////
@@ -83,13 +81,13 @@ odf_chart_context::~odf_chart_context()
void odf_chart_context::set_styles_context(odf_style_context * style_context)
{
impl_->styles_context_ = style_context;
- impl_->drawing_context_.set_styles_context(style_context);
+ impl_->odf_context_->drawing_context()->set_styles_context(style_context);
impl_->text_context_.set_styles_context(style_context);
}
odf_drawing_context * odf_chart_context::drawing_context()
{
- return &impl_->drawing_context_;
+ return impl_->odf_context_->drawing_context();
}
odf_text_context * odf_chart_context::text_context()
{
diff --git a/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp b/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp
index 2631c3a5f1..1d2396c6dd 100644
--- a/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp
+++ b/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp
@@ -135,6 +135,7 @@ void odf_conversion_context::end_chart()
chart_context_.end_chart();
end_object();
+ chart_context_.set_styles_context(styles_context());
}
void odf_conversion_context::end_spreadsheet()
{
diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp
index 851d2a51ee..f0a5fb69f6 100644
--- a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp
+++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp
@@ -1,5 +1,6 @@
#include "precompiled_cpodf.h"
+#include "../utils.h"
#include "ods_conversion_context.h"
#include "office_spreadsheet.h"
@@ -73,11 +74,24 @@ void parsing_ref (const std::wstring & ref, int & col,int & row)
col = getColAddressInv(strCol)+1;
row = getRowAdderssInv(strRow)+1;
+}
+void calculate_size_font_symbols(_font_metrix & metrix)
+{
+ double appr_px = _gdi_graphics_::calculate_size_symbol(metrix.font_name,metrix.font_size,metrix.italic,metrix.bold);
+
+ if (appr_px > 0)
+ {
+ //pixels to pt
+ metrix.approx_symbol_size = appr_px * 72./96. ;///1.1;//"1.2" волшебное число оО
+ metrix.IsCalc = true;
+ }
+
}
}
ods_conversion_context::ods_conversion_context(package::odf_document * outputDocument)
: odf_conversion_context(outputDocument), table_context_(*this), current_text_context_(NULL)
{
+ font_metrix_ = _font_metrix();
}
@@ -313,6 +327,19 @@ void ods_conversion_context::end_cell()
current_table().end_cell();
end_text_context();
}
+void ods_conversion_context::calculate_font_metrix(std::wstring name, double size, bool italic, bool bold)
+{
+ if (font_metrix_.IsCalc)return;
+
+ font_metrix_.font_size = size;
+ font_metrix_.italic = italic;
+ font_metrix_.bold = bold;
+ font_metrix_.font_name = name;
+
+////////////////////////////////////////////
+ utils::calculate_size_font_symbols(font_metrix_);
+}
+
void ods_conversion_context::start_columns()
{
}
@@ -334,7 +361,7 @@ void ods_conversion_context::start_rows()
void ods_conversion_context::end_rows()
{
//add default last row
- int repeat = std::max(current_table().dimension_row,1024) - current_table().current_row();
+ int repeat = max(current_table().dimension_row,1024) - current_table().current_row();
if (repeat < 0) repeat = 1;
start_row(current_table().current_row()+1,repeat,0,true);
diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h
index 07d145064c..bb68de169a 100644
--- a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h
+++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h
@@ -9,10 +9,23 @@ namespace odf {
class office_spreadsheet;
class odf_text_context;
+struct _font_metrix
+{
+ _font_metrix(){IsCalc = italic = bold = false; font_size = approx_symbol_size =0;}
+ bool IsCalc;
+
+ std::wstring font_name;
+ double font_size;
+ bool italic;
+ bool bold;
+
+ double approx_symbol_size;//in pt
+};
+
class ods_conversion_context : public odf_conversion_context
{
public:
- ods_conversion_context(package::odf_document * outputDocument);// : odf_conversion_context(outputDocument){}
+ ods_conversion_context(package::odf_document * outputDocument);
virtual void start_document();
@@ -24,6 +37,8 @@ public:
void add_column(int start_column, int repeated, int level = 0, bool _default = false);
void end_columns();
+ void calculate_font_metrix(std::wstring name, double size, bool italic, bool bold);
+
void start_rows();
void start_row(int _start_row, int repeated, int level = 0, bool _default = false);
void end_row();
@@ -57,7 +72,10 @@ public:
void start_image(std::wstring & image_file_name);
void end_image(){drawing_context()->end_image();}
+ double convert_symbol_width(double val) {return val * font_metrix_.approx_symbol_size;}
+
private:
+ _font_metrix font_metrix_;
ods_table_context table_context_;
odf_text_context* current_text_context_;
diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp
index 876a8864f1..4b57464858 100644
--- a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp
+++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp
@@ -194,7 +194,7 @@ void ods_table_state::set_column_default_cell_style(std::wstring & style_name)
column->table_table_column_attlist_.table_default_cell_style_name_ = style_ref(style_name);
}
-void ods_table_state::set_column_width(int width)//cm, pt ???
+void ods_table_state::set_column_width(double width)//cm, pt ???
{
odf::style* style = dynamic_cast(columns_.back().style_elm.get());
if (!style)return;
@@ -204,7 +204,7 @@ void ods_table_state::set_column_width(int width)//cm, pt ???
columns_.back().size = width; //pt
- column_properties->style_table_column_properties_attlist_.style_column_width_ = length(width/4.35,length::cm);
+ column_properties->style_table_column_properties_attlist_.style_column_width_ = length(length(width,length::pt).get_value_unit(length::cm),length::cm);
}
void ods_table_state::set_column_optimal_width(bool val)
{
@@ -279,7 +279,7 @@ void ods_table_state::set_row_height(double height)
rows_.back().size = height;//pt
- row_properties->style_table_row_properties_attlist_.style_row_height_ = length(height/22.85,length::cm);
+ row_properties->style_table_row_properties_attlist_.style_row_height_ = length(length(height,length::pt).get_value_unit(length::cm),length::cm);
}
diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h
index ee292dddf3..2bc3d0c1c1 100644
--- a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h
+++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h
@@ -84,7 +84,7 @@ public:
void set_table_dimension(int col, int row);
void add_column(office_element_ptr & elm, int repeated ,office_element_ptr & style);
- void set_column_width(int width);
+ void set_column_width(double width);
void set_column_optimal_width(bool val);
void set_column_default_cell_style(std::wstring & style_name);
diff --git a/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj b/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj
index e568c908c7..57d5c19eb2 100644
--- a/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj
+++ b/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj
@@ -186,10 +186,6 @@
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
-
-
diff --git a/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp b/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp
index b95b406ce1..6b95fa32c6 100644
--- a/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp
+++ b/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp
@@ -3,7 +3,7 @@
#include "stdAfx.h"
#include "Converter.h"
-#include "Additional.h"
+#include "../utils.h"
#include "XlsxConverter.h"
#include "DocxConverter.h"
@@ -297,7 +297,7 @@ void OoxConverter::convert(OOX::Drawing::CBlipFillProperties *oox_bitmap_fill)
if (pathImage.GetLength() > 0)
{
odf_context()->drawing_context()->set_bitmap_link(string2std_string(pathImage));
- _image_file_::GetResolution(pathImage, Width, Height);
+ _gdi_graphics_::GetResolution(pathImage, Width, Height);
}
else
{
@@ -821,6 +821,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CChartSpace *oox_chart)
if ((!oox_chart) && (!oox_chart->m_oChartSpace.m_chart))return;
odf_context()->start_chart();
+ convert(oox_chart->m_oChartSpace.m_oSpPr.GetPointer());
convert(oox_chart->m_oChartSpace.m_chart->m_title);
convert(oox_chart->m_oChartSpace.m_chart->m_legend);
@@ -838,7 +839,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_Title* ct_title)
if (ct_title == NULL)return;
odf_context()->chart_context()->start_title();
-
+ convert(ct_title->m_oSpPr.GetPointer());
odf_context()->chart_context()->end_element();
}
void OoxConverter::convert(OOX::Spreadsheet::CT_Legend* ct_legend)
@@ -846,7 +847,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_Legend* ct_legend)
if (ct_legend == NULL)return;
odf_context()->chart_context()->start_legend();
-
+ convert(ct_legend->m_oSpPr.GetPointer());
odf_context()->chart_context()->end_element();
}
void OoxConverter::convert(OOX::Spreadsheet::CT_PlotArea* ct_plotArea)
@@ -854,12 +855,11 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_PlotArea* ct_plotArea)
if (ct_plotArea == NULL)return;
odf_context()->chart_context()->start_plot_area();
+ convert(ct_plotArea->m_oSpPr.GetPointer());
+
if (ct_plotArea->m_layout)//разметка
{
}
- if (ct_plotArea->m_spPr)
- {
- }
for (long i=0; i< ct_plotArea->m_Items.GetCount(); i++)//
{
if (!ct_plotArea->m_ItemsElementName0[i]) continue;
@@ -905,6 +905,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_CatAx* ct_catAx)
if (ct_catAx == NULL)return;
odf_context()->chart_context()->start_axis();
+ convert(ct_catAx->m_oSpPr.GetPointer());
convert(ct_catAx->m_title);
odf_context()->chart_context()->end_element();
}
@@ -913,6 +914,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_DateAx* ct_dateAx)
if (ct_dateAx == NULL)return;
odf_context()->chart_context()->start_axis();
+ convert(ct_dateAx->m_oSpPr.GetPointer());
convert(ct_dateAx->m_title);
odf_context()->chart_context()->end_element();
}
@@ -921,6 +923,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_SerAx* ct_serAx)
if (ct_serAx == NULL)return;
odf_context()->chart_context()->start_axis();
+ convert(ct_serAx->m_oSpPr.GetPointer());
convert(ct_serAx->m_title);
odf_context()->chart_context()->end_element();
}
@@ -929,6 +932,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_ValAx* ct_valAx)
if (ct_valAx == NULL)return;
odf_context()->chart_context()->start_axis();
+ convert(ct_valAx->m_oSpPr.GetPointer());
convert(ct_valAx->m_title);
odf_context()->chart_context()->end_element();
}
@@ -1115,6 +1119,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_OfPieChart *chart)
void OoxConverter::convert(OOX::Spreadsheet::CT_AreaSer* ser)
{
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_cat, 1);
convert(ser->m_val, 2);
odf_context()->chart_context()->end_element();
@@ -1124,6 +1129,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_BubbleSer* ser)
if (ser == NULL)return;
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_xVal, 1);
convert(ser->m_yVal, 2);
odf_context()->chart_context()->end_element();
@@ -1133,6 +1139,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_SurfaceSer* ser)
if (ser == NULL)return;
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_cat, 1);
convert(ser->m_val, 2);
odf_context()->chart_context()->end_element();
@@ -1142,6 +1149,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_PieSer* ser)
if (ser == NULL)return;
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_cat, 1);
convert(ser->m_val, 2);
odf_context()->chart_context()->end_element();
@@ -1151,6 +1159,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_BarSer* ser)
if (ser == NULL)return;
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_cat, 1);
convert(ser->m_val, 2);
odf_context()->chart_context()->end_element();
@@ -1160,6 +1169,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_ScatterSer* ser)
if (ser == NULL)return;
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_xVal, 1);
convert(ser->m_yVal, 2);
odf_context()->chart_context()->end_element();
@@ -1169,6 +1179,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_RadarSer* ser)
if (ser == NULL)return;
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_cat, 1);
convert(ser->m_val, 2);
odf_context()->chart_context()->end_element();
@@ -1178,6 +1189,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_LineSer* ser)
if (ser == NULL)return;
odf_context()->chart_context()->start_series();
+ convert(ser->m_oSpPr.GetPointer());
convert(ser->m_cat, 1);
convert(ser->m_val, 2);
odf_context()->chart_context()->end_element();
diff --git a/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp b/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp
index 2b8d4aa336..71188e7363 100644
--- a/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp
+++ b/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp
@@ -3,7 +3,7 @@
#include "stdAfx.h"
#include "XlsxConverter.h"
-#include "Additional.h"
+#include "../utils.h"
#include
@@ -484,6 +484,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCol *oox_column)
else if (oox_column->m_oCustomWidth.IsInit() == false ||
(oox_column->m_oCustomWidth.IsInit() == true && oox_column->m_oCustomWidth->GetValue() == 1))
{
+ width = ods_context->convert_symbol_width(width);
ods_context->current_table().set_column_width(width);
ods_context->current_table().set_column_optimal_width(false);
// пока не преобразовываем правильно размерность !!!
@@ -628,10 +629,18 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf::style_text_prop
if (font == NULL)return;
if (text_properties == NULL)return;
+ std::wstring font_name;
+ double font_size = 0;
+ bool font_bold = false;
+ bool font_italic = false;
+
if (font->m_oBold.IsInit())
{
if (font->m_oBold->m_oVal.ToBool() ==true)
+ {
+ font_bold = true;
text_properties->content().fo_font_weight_ = odf::font_weight(odf::font_weight::WBold);
+ }
else
text_properties->content().fo_font_weight_ = odf::font_weight(odf::font_weight::WNormal);
}
@@ -644,13 +653,17 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf::style_text_prop
if (font->m_oItalic.IsInit())
{
if (font->m_oItalic->m_oVal.ToBool() ==true)
+ {
+ font_italic = true;
text_properties->content().fo_font_style_ = odf::font_style(odf::font_style::Italic);
+ }
else
text_properties->content().fo_font_style_ = odf::font_style(odf::font_style::Normal);
}
if (font->m_oSz.IsInit())
{
- OoxConverter::convert(font->m_oSz->m_oVal->GetValue(), text_properties->content().fo_font_size_);
+ font_size = font->m_oSz->m_oVal->GetValue();
+ OoxConverter::convert(font_size, text_properties->content().fo_font_size_);
}
if (font->m_oFamily.IsInit())
{
@@ -658,9 +671,11 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf::style_text_prop
if (font->m_oRFont.IsInit())
{
+ font_name = string2std_string(font->m_oRFont->m_sVal.get());
//text_properties->content().style_font_name_ = string2std_string(font->m_oRFont->m_sVal.get());
- text_properties->content().fo_font_family_ = string2std_string(font->m_oRFont->m_sVal.get());
+ text_properties->content().fo_font_family_ = font_name;
}
+ ods_context->calculate_font_metrix(font_name,font_size,font_italic,font_bold);
/////
//...
/////
@@ -1228,7 +1243,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CPic* oox_picture)
sID = oox_picture->m_oBlipFill->m_oBlip->m_oLink.GetValue();
//???
}
- _image_file_::GetResolution(pathImage, Width, Height);
+ _gdi_graphics_::GetResolution(pathImage, Width, Height);
}
ods_context->start_image(string2std_string(pathImage));
{
diff --git a/ASCOfficeOdfFileW/source/utils.h b/ASCOfficeOdfFileW/source/utils.h
new file mode 100644
index 0000000000..5c0073482a
--- /dev/null
+++ b/ASCOfficeOdfFileW/source/utils.h
@@ -0,0 +1,75 @@
+#pragma once
+
+#include
+#include
+#pragma comment(lib, "gdiplus.lib")
+
+namespace _gdi_graphics_
+{
+ bool static GetResolution(const WCHAR* fileName, double & Width, double &Height) //pt
+ {
+ bool result =false;
+ Gdiplus::GdiplusStartupInput gdiplusStartupInput;
+ ULONG_PTR gdiplusToken=0;
+ Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
+
+ Gdiplus::Bitmap *file = new Gdiplus::Bitmap(fileName,false);
+ if ((file) && (file->GetLastStatus()==Gdiplus::Ok))
+ {
+ Height = file->GetHeight();
+ Width = file->GetWidth();
+
+ double dpi_x = file->GetHorizontalResolution();
+ double dpi_y = file->GetVerticalResolution();
+
+ if (dpi_x <1 )dpi_x = 96;
+ if (dpi_y <1 )dpi_y = 96;
+
+ Height = Height *72. / dpi_y;
+ Width = Width * 72. /dpi_x;
+
+ result = true;
+ delete file;
+ }
+ Gdiplus::GdiplusShutdown(gdiplusToken);
+ return result;
+ }
+ double static calculate_size_symbol(std::wstring name, double size, bool italic, bool bold)
+ {
+ double result =0;
+ Gdiplus::GdiplusStartupInput gdiplusStartupInput;
+ ULONG_PTR gdiplusToken=0;
+ Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
+ ////
+ std::wstring test_string = L"0123456789";
+
+ int style = Gdiplus::FontStyleRegular;
+ if (bold && italic) style = Gdiplus::FontStyleBoldItalic;
+ else if (bold) style = Gdiplus::FontStyleBold;
+ else if (italic) style = Gdiplus::FontStyleItalic;
+
+ Gdiplus::Graphics * gr = new Gdiplus::Graphics(GetWindowDC(NULL));
+ if (gr)
+ {
+ Gdiplus::Font *font = new Gdiplus::Font(name.c_str(),size,style);
+ if (font)
+ {
+ Gdiplus::SizeF layout;
+ Gdiplus::RectF bound;
+ Gdiplus::Status res = gr->MeasureString(test_string.c_str(),test_string.length(),font,layout,&bound);
+
+ if (res==0)result = bound.Width / test_string.length();
+ //normalize to dpi = 96;
+
+ double dpi = gr->GetDpiX();
+
+ result = result * 96./dpi;
+
+ delete font;
+ }
+ delete gr;
+ }
+ Gdiplus::GdiplusShutdown(gdiplusToken);
+ return result;
+ }
+};
\ No newline at end of file
diff --git a/ASCOfficeOdfFileW/version.h b/ASCOfficeOdfFileW/version.h
index abe1338d0e..81b7fa77c0 100644
--- a/ASCOfficeOdfFileW/version.h
+++ b/ASCOfficeOdfFileW/version.h
@@ -2,6 +2,6 @@
//1
//2
//0
-//34
-#define INTVER 1,2,0,34
-#define STRVER "1,2,0,34\0"
+//35
+#define INTVER 1,2,0,35
+#define STRVER "1,2,0,35\0"
diff --git a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h
index d7672374c6..7e9d423f68 100644
--- a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h
+++ b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h
@@ -785,12 +785,14 @@ namespace OOX
m_eEffectType = effecttypeUnknown;
CWCharWrapper sName = oReader.GetName();
- if ( _T("a:spPr") == sName )
+ if ( _T("a:spPr") == sName )
m_eType = et_a_spPr;
else if ( _T("pic:spPr") == sName )
m_eType = et_pic_spPr;
else if ( _T("xdr:spPr") == sName )
m_eType = et_xdr_spPr;
+ else if ( _T("c:spPr") == sName )
+ m_eType = et_c_spPr;
else
return;
@@ -875,6 +877,8 @@ namespace OOX
sResult = _T("");
else if ( et_xdr_spPr == m_eType )
sResult = _T("");
+ else if ( et_c_spPr == m_eType )
+ sResult = _T("");
return sResult;
}
virtual EElementType getType() const
diff --git a/Common/DocxFormat/Source/DocxFormat/WritingElement.h b/Common/DocxFormat/Source/DocxFormat/WritingElement.h
index d28cfe3b16..806b0e1f36 100644
--- a/Common/DocxFormat/Source/DocxFormat/WritingElement.h
+++ b/Common/DocxFormat/Source/DocxFormat/WritingElement.h
@@ -468,6 +468,7 @@ namespace OOX
et_xdr_spPr, //
et_c_chart, //
+ et_c_spPr,
et_sl_schema, //
et_sl_schemaLibrary, //
diff --git a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp
index 1c9c1d9f27..59a88dc68e 100644
--- a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp
+++ b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp
@@ -2,6 +2,33 @@
#include "ChartSerialize.h"
namespace OOX{
namespace Spreadsheet{
+
+ nullable FromString_spPr(CString *spPr)
+ {
+ nullable oSpPr;
+ XmlUtils::CXmlLiteReader oShapeReader;
+ //сформируем полноценную xml-строку
+ CString xmlString = L"";
+ xmlString += L"";
+ xmlString += *spPr;
+ xmlString += L"";
+ BOOL result =oShapeReader.FromString(xmlString);
+
+ result = oShapeReader.ReadNextNode();//root ... skiping
+ result = oShapeReader.ReadNextNode();
+
+ CWCharWrapper sName = oShapeReader.GetName();
+
+ if (_T("c:spPr") == sName)
+ oSpPr = oShapeReader;
+ return oSpPr;
+ }
bool FromXml_ST_PageSetupOrientation(CString& val, ST_PageSetupOrientation& eOut)
{
bool bRes = true;
@@ -1070,6 +1097,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -2399,6 +2427,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -2848,6 +2877,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -3043,6 +3073,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -3407,6 +3438,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
}
}
@@ -3478,6 +3510,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -4209,6 +4242,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -4666,6 +4700,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -4880,6 +4915,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -5223,6 +5259,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -5539,6 +5576,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("invertIfNegative") == sName)
{
@@ -5810,6 +5848,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("pictureOptions") == sName)
{
@@ -5909,6 +5948,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("extLst") == sName)
{
@@ -6986,6 +7026,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("trendlineType") == sName)
{
@@ -7297,6 +7338,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
@@ -7434,6 +7476,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("extLst") == sName)
{
@@ -8520,6 +8563,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("cat") == sName)
{
@@ -8609,6 +8653,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
}
}
@@ -9138,6 +9183,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("explosion") == sName)
{
@@ -9600,6 +9646,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("invertIfNegative") == sName)
{
@@ -10429,6 +10476,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("marker") == sName)
{
@@ -10779,6 +10827,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("marker") == sName)
{
@@ -11223,6 +11272,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("marker") == sName)
{
@@ -11447,6 +11497,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
}
}
@@ -12026,6 +12077,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("pictureOptions") == sName)
{
@@ -12504,6 +12556,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("extLst") == sName)
{
@@ -12833,6 +12886,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("pictureOptions") == sName)
{
@@ -13246,6 +13300,7 @@ namespace OOX{
CString sVal = oReader.GetOuterXml();
*pNewElem = sVal;
m_spPr = pNewElem;
+ m_oSpPr = FromString_spPr(m_spPr);
}
else if(_T("txPr") == sName)
{
diff --git a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h
index 36ae0002d1..cbbf10eec8 100644
--- a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h
+++ b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h
@@ -451,6 +451,7 @@ namespace OOX{
CT_Chart* m_chart;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -672,6 +673,7 @@ namespace OOX{
CT_Boolean* m_overlay;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -770,6 +772,7 @@ namespace OOX{
CT_Boolean* m_showKeys;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -807,6 +810,7 @@ namespace OOX{
CT_TickLblPos* m_tickLblPos;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -884,6 +888,7 @@ namespace OOX{
public:
//Member
CString* m_spPr;
+ nullable m_oSpPr;
CT_ChartLines();
~CT_ChartLines();
void fromXML(XmlUtils::CXmlLiteReader& oReader);
@@ -901,6 +906,7 @@ namespace OOX{
CT_Boolean* m_overlay;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -1062,6 +1068,7 @@ namespace OOX{
CT_TickLblPos* m_tickLblPos;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -1152,6 +1159,7 @@ namespace OOX{
CT_TickLblPos* m_tickLblPos;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -1189,6 +1197,7 @@ namespace OOX{
CT_Tx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
CT_DispUnitsLbl();
@@ -1263,6 +1272,7 @@ namespace OOX{
CT_TickLblPos* m_tickLblPos;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -1320,6 +1330,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_Boolean* m_invertIfNegative;
//Member
@@ -1374,6 +1385,7 @@ namespace OOX{
CT_UnsignedInt* m_explosion;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_PictureOptions* m_pictureOptions;
//Member
@@ -1393,6 +1405,7 @@ namespace OOX{
CT_MarkerSize* m_size;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_extLst* m_extLst;
CT_Marker();
@@ -1518,6 +1531,7 @@ namespace OOX{
CString* m_name;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_TrendlineType* m_trendlineType;
//Member
@@ -1588,6 +1602,7 @@ namespace OOX{
CT_NumFmt* m_numFmt;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member
@@ -1617,6 +1632,7 @@ namespace OOX{
CT_Double* m_val;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_extLst* m_extLst;
CT_ErrBars();
@@ -1846,6 +1862,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_AxDataSource* m_cat;
//Member
@@ -1865,6 +1882,7 @@ namespace OOX{
CT_UnsignedInt* m_idx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
CT_BandFmt();
~CT_BandFmt();
void fromXML(XmlUtils::CXmlLiteReader& oReader);
@@ -1976,6 +1994,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_UnsignedInt* m_explosion;
//Member
@@ -2067,6 +2086,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_Boolean* m_invertIfNegative;
//Member
@@ -2234,6 +2254,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_Marker* m_marker;
//Member
@@ -2301,6 +2322,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_Marker* m_marker;
//Member
@@ -2385,6 +2407,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_Marker* m_marker;
//Member
@@ -2431,6 +2454,7 @@ namespace OOX{
public:
//Member
CString* m_spPr;
+ nullable m_oSpPr;
CT_UpDownBar();
~CT_UpDownBar();
void fromXML(XmlUtils::CXmlLiteReader& oReader);
@@ -2540,6 +2564,7 @@ namespace OOX{
CT_SerTx* m_tx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_PictureOptions* m_pictureOptions;
//Member
@@ -2602,6 +2627,7 @@ namespace OOX{
CT_DTable* m_dTable;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_extLst* m_extLst;
CT_PlotArea();
@@ -2630,6 +2656,7 @@ namespace OOX{
CT_Thickness* m_thickness;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CT_PictureOptions* m_pictureOptions;
//Member
@@ -2725,6 +2752,7 @@ namespace OOX{
CT_UnsignedInt* m_idx;
//Member
CString* m_spPr;
+ nullable m_oSpPr;
//Member
CString* m_txPr;
//Member