Commit 2026d064 authored by ElenaSubbotina's avatar ElenaSubbotina

DocFormatReader - fix shape freeforms

parent 42257ca4
...@@ -35,11 +35,23 @@ ...@@ -35,11 +35,23 @@
namespace DocFileFormat namespace DocFileFormat
{ {
struct _guides
{
unsigned char type;
unsigned char param_type1;
unsigned char param_type2;
unsigned char param_type3;
WORD param1;
WORD param2;
WORD param3;
};
class PathParser class PathParser
{ {
public: public:
PathParser (const unsigned char* pSegmentInfo, unsigned int pSegmentInfoSize, const unsigned char* pVertices, unsigned int pVerticesSize) PathParser (const unsigned char* pSegmentInfo, unsigned int pSegmentInfoSize, const unsigned char* pVertices, unsigned int pVerticesSize, std::vector<_guides> & guides)
{ {
if ((pSegmentInfo != NULL) && (pSegmentInfoSize > 0)) if ((pSegmentInfo != NULL) && (pSegmentInfoSize > 0))
{ {
...@@ -105,31 +117,40 @@ namespace DocFileFormat ...@@ -105,31 +117,40 @@ namespace DocFileFormat
unsigned short nElemsAlloc = FormatUtils::BytesToUInt16(pVertices, 2, pVerticesSize); unsigned short nElemsAlloc = FormatUtils::BytesToUInt16(pVertices, 2, pVerticesSize);
unsigned short cb = FormatUtils::BytesToUInt16(pVertices, 4, pVerticesSize); unsigned short cb = FormatUtils::BytesToUInt16(pVertices, 4, pVerticesSize);
if (0xfff0 == cb) for (unsigned short i = 0; i < nElems; ++i)
{ {
cb = 4; POINT point;
if (0xfff0 == cb)
for (unsigned short i = 0; i < nElems; ++i)
{ {
POINT point; cb = 4;
point.x = FormatUtils::BytesToInt16(pVertices + 6, (i * cb), pVerticesSize); point.x = FormatUtils::BytesToInt16(pVertices + 6, (i * cb), pVerticesSize);
point.y = FormatUtils::BytesToInt16(pVertices + 6, (i * cb) + (cb / 2), pVerticesSize); point.y = FormatUtils::BytesToInt16(pVertices + 6, (i * cb) + (cb / 2), pVerticesSize);
m_arPoints.push_back(point);
} }
} else
else
{
for (unsigned short i = 0; i < nElems; ++i)
{ {
POINT point;
point.x = FormatUtils::BytesToInt32(pVertices + 6, (i * cb), pVerticesSize); point.x = FormatUtils::BytesToInt32(pVertices + 6, (i * cb), pVerticesSize);
point.y = FormatUtils::BytesToInt32(pVertices + 6, (i * cb) + (cb / 2), pVerticesSize); point.y = FormatUtils::BytesToInt32(pVertices + 6, (i * cb) + (cb / 2), pVerticesSize);
}
m_arPoints.push_back(point); LONG lMinF = (LONG)0x80000000;
if (lMinF <= point.x)
{
int index = (DWORD)point.x - 0x80000000;
if (index >= 0 && index < guides.size())
{
point.x = guides[index].param3;
}
}
if (lMinF <= point.y)
{
int index = (DWORD)point.y - 0x80000000;
if (index >= 0 && index < guides.size())
{
point.y = guides[index].param3;
}
} }
m_arPoints.push_back(point);
} }
} }
} }
......
...@@ -106,21 +106,20 @@ namespace DocFileFormat ...@@ -106,21 +106,20 @@ namespace DocFileFormat
return new ShapeContainer( _reader, bodySize, typeCode, version, instance ); return new ShapeContainer( _reader, bodySize, typeCode, version, instance );
} }
std::list<OptionEntry> ExtractOptions() const std::vector<OptionEntryPtr> ExtractOptions() const
{ {
std::list<OptionEntry> ret; std::vector<OptionEntryPtr> ret;
//build the list of all option entries of this shape //build the list of all option entries of this shape
for ( std::vector<Record*>::const_iterator iter = this->Children.begin(); iter != this->Children.end(); iter++ ) for ( std::vector<Record*>::const_iterator iter = this->Children.begin(); iter != this->Children.end(); iter++ )
{ {
ShapeOptions* opt = dynamic_cast<ShapeOptions*>( *iter ); ShapeOptions* opt = dynamic_cast<ShapeOptions*>( *iter );
if ( opt != NULL ) if ( opt == NULL ) continue;
for ( size_t i = 0; i < opt->Options.size(); i++)
{ {
for ( std::vector<OptionEntry>::iterator oeIter = opt->Options.begin(); oeIter != opt->Options.end(); oeIter++ ) ret.push_back( opt->Options[i]);
{
ret.push_back( *oeIter );
}
} }
} }
......
...@@ -568,18 +568,19 @@ namespace DocFileFormat ...@@ -568,18 +568,19 @@ namespace DocFileFormat
struct OptionEntry struct OptionEntry
{ {
OptionEntry() : pid(PropertyId_left), fBid(false), fComplex(false), op(0), opComplex(NULL) OptionEntry() : pid(PropertyId_left), fBid(false), fComplex(false), op(0)
{ {
} }
PropertyId pid; PropertyId pid;
bool fBid; bool fBid;
bool fComplex; bool fComplex;
unsigned int op; unsigned int op;
unsigned char* opComplex; std::shared_ptr<unsigned char> opComplex;
}; };
typedef std::shared_ptr<OptionEntry> OptionEntryPtr;
class ShapeOptions: public Record class ShapeOptions: public Record
{ {
public: public:
...@@ -587,8 +588,8 @@ namespace DocFileFormat ...@@ -587,8 +588,8 @@ namespace DocFileFormat
static const unsigned short TYPE_CODE_0xF121 = 0xF121; static const unsigned short TYPE_CODE_0xF121 = 0xF121;
static const unsigned short TYPE_CODE_0xF122 = 0xF122; static const unsigned short TYPE_CODE_0xF122 = 0xF122;
std::vector<OptionEntry> Options; std::vector<OptionEntryPtr> Options;
std::map<PropertyId, OptionEntry> OptionsByID; std::map<PropertyId, OptionEntryPtr> OptionsByID;
ShapeOptions() : Record() ShapeOptions() : Record()
{ {
...@@ -596,8 +597,8 @@ namespace DocFileFormat ...@@ -596,8 +597,8 @@ namespace DocFileFormat
virtual ~ShapeOptions() virtual ~ShapeOptions()
{ {
for (std::vector<OptionEntry>::iterator iter = Options.begin(); iter != Options.end(); ++iter) //for (std::vector<OptionEntry>::iterator iter = Options.begin(); iter != Options.end(); ++iter)
RELEASEARRAYOBJECTS( iter->opComplex ); // RELEASEARRAYOBJECTS( iter->opComplex );
} }
ShapeOptions (IBinaryReader* _reader, unsigned int size, unsigned int typeCode, unsigned int version, unsigned int instance) : Record (_reader, size, typeCode, version, instance) ShapeOptions (IBinaryReader* _reader, unsigned int size, unsigned int typeCode, unsigned int version, unsigned int instance) : Record (_reader, size, typeCode, version, instance)
...@@ -606,16 +607,16 @@ namespace DocFileFormat ...@@ -606,16 +607,16 @@ namespace DocFileFormat
//instance is the count of properties stored in this record //instance is the count of properties stored in this record
OptionEntry entry;
//parse the flags and the simple values //parse the flags and the simple values
for (unsigned int i = 0; i < instance; ++i) for (unsigned int i = 0; i < instance; ++i)
{ {
OptionEntryPtr entry = std::shared_ptr<OptionEntry>(new OptionEntry());
unsigned short flag = Reader->ReadUInt16(); unsigned short flag = Reader->ReadUInt16();
entry.pid = (PropertyId)FormatUtils::BitmaskToInt (flag, 0x3FFF); entry->pid = (PropertyId)FormatUtils::BitmaskToInt (flag, 0x3FFF);
entry.fBid = FormatUtils::BitmaskToBool (flag, 0x4000); entry->fBid = FormatUtils::BitmaskToBool (flag, 0x4000);
entry.fComplex = FormatUtils::BitmaskToBool (flag, 0x8000); entry->fComplex = FormatUtils::BitmaskToBool (flag, 0x8000);
entry.op = Reader->ReadUInt32(); entry->op = Reader->ReadUInt32();
Options.push_back( entry ); Options.push_back( entry );
} }
...@@ -625,21 +626,12 @@ namespace DocFileFormat ...@@ -625,21 +626,12 @@ namespace DocFileFormat
//of the OptionEntry arry, sorted by pid //of the OptionEntry arry, sorted by pid
for (unsigned int i = 0; i < instance; ++i) for (unsigned int i = 0; i < instance; ++i)
{ {
if (Options[i].fComplex) if (Options[i]->fComplex && Options[i]->op > 0)
{ {
int read_size = (int)Options[i].op + 6 ; //???? Options[i]->opComplex = std::shared_ptr<unsigned char>(Reader->ReadBytes( Options[i]->op, true ));
//todooo !!!! проверить все остальные !! тут размер в зависимости от типа Complex!!!
switch(Options[i].pid)
{
case PropertyId::gtextUNICODE:
case PropertyId::gtextFont:
read_size = (int)Options[i].op;
break;
}
Options[i].opComplex = Reader->ReadBytes( read_size, true );
} }
OptionsByID.insert(std::pair<PropertyId, OptionEntry>(Options[i].pid, Options[i])); OptionsByID.insert(std::make_pair(Options[i]->pid, Options[i]));
} }
Reader->Seek(( pos + size ), 0/*STREAM_SEEK_SET*/); Reader->Seek(( pos + size ), 0/*STREAM_SEEK_SET*/);
......
...@@ -241,7 +241,7 @@ namespace DocFileFormat ...@@ -241,7 +241,7 @@ namespace DocFileFormat
std::wstring strHeight = FormatUtils::DoubleToWideString( height.ToPoints() ); std::wstring strHeight = FormatUtils::DoubleToWideString( height.ToPoints() );
std::wstring strStyle; std::wstring strStyle;
std::list<OptionEntry> options; std::vector<OptionEntryPtr> options;
PictureFrameType type; PictureFrameType type;
if ((pict->shapeContainer || pict->blipStoreEntry) && pict->shapeContainer->Children.size() > 0) if ((pict->shapeContainer || pict->blipStoreEntry) && pict->shapeContainer->Children.size() > 0)
...@@ -282,9 +282,9 @@ namespace DocFileFormat ...@@ -282,9 +282,9 @@ namespace DocFileFormat
} }
//todooo oбъединить с shape_mapping //todooo oбъединить с shape_mapping
std::list<OptionEntry>::iterator end = options.end(); for (size_t i = 0; i < options.size(); i++)
for (std::list<OptionEntry>::iterator iter = options.begin(); iter != end; ++iter)
{ {
OptionEntryPtr & iter = options[i];
switch ( iter->pid ) switch ( iter->pid )
{ {
case wzEquationXML: case wzEquationXML:
...@@ -292,7 +292,7 @@ namespace DocFileFormat ...@@ -292,7 +292,7 @@ namespace DocFileFormat
m_isEquation = true; m_isEquation = true;
m_isEmbedded = true; m_isEmbedded = true;
m_embeddedData = std::string((char*)iter->opComplex, iter->op); m_embeddedData = std::string((char*)iter->opComplex.get(), iter->op);
if (ParseEmbeddedEquation( m_embeddedData, m_equationXml)) if (ParseEmbeddedEquation( m_embeddedData, m_equationXml))
{ {
...@@ -303,7 +303,7 @@ namespace DocFileFormat ...@@ -303,7 +303,7 @@ namespace DocFileFormat
{ {
//встроенная неведомая хуйня //встроенная неведомая хуйня
m_isEmbedded = true; m_isEmbedded = true;
m_embeddedData = std::string((char*)iter->opComplex, iter->op); m_embeddedData = std::string((char*)iter->opComplex.get(), iter->op);
//if (ParseEmbeddedBlob( m_embeddedData, m_blobXml)) // todoooo //if (ParseEmbeddedBlob( m_embeddedData, m_blobXml)) // todoooo
//{ //{
......
...@@ -77,17 +77,10 @@ namespace DocFileFormat ...@@ -77,17 +77,10 @@ namespace DocFileFormat
void WritePrimitiveProps(DrawingPrimitive * primitive, bool root); void WritePrimitiveProps(DrawingPrimitive * primitive, bool root);
// Converts a group of shapes
void WriteGroup(const GroupContainer* pContainer); void WriteGroup(const GroupContainer* pContainer);
// Converts a single shape
void WriteShape (const ShapeContainer* pContainer); void WriteShape (const ShapeContainer* pContainer);
/// Generates a string id for the given shape
std::wstring GenShapeId(const Shape* pShape) const; std::wstring GenShapeId(const Shape* pShape) const;
/// Build the VML wrapcoords string for a given pWrapPolygonVertices
std::wstring getWrapCoords( const OptionEntry& pWrapPolygonVertices ) const;
/// Copies the picture from the binary stream to the zip archive
/// and creates the relationships for the image.
bool copyPicture( const BlipStoreEntry* bse ); bool copyPicture( const BlipStoreEntry* bse );
std::wstring GetTargetExt( Global::BlipType _type ) const; std::wstring GetTargetExt( Global::BlipType _type ) const;
...@@ -98,21 +91,22 @@ namespace DocFileFormat ...@@ -98,21 +91,22 @@ namespace DocFileFormat
std::wstring getTextboxAnchor( unsigned int anchor ) const; std::wstring getTextboxAnchor( unsigned int anchor ) const;
void AppendOptionsToStyle( std::wstring* style, const std::list<OptionEntry>& options, int zIndex ) const; std::wstring buildStyle ( const Shape* shape, const ChildAnchor* anchor, const std::vector<OptionEntryPtr>& options, int zIndex ) const;
void AppendOptionsToStyle ( std::wstring* style, const std::vector<OptionEntryPtr>& options, int zIndex ) const;
std::wstring buildStyle ( const Shape* shape, const ChildAnchor* anchor, const std::list<OptionEntry>& options, int zIndex ) const; int UpdateFromGuides(const int val) const;
std::wstring getLineStyle ( unsigned int p ) const; std::wstring getLineStyle ( unsigned int p ) const;
std::wstring getArrowStyle ( unsigned int op ) const; std::wstring getArrowStyle ( unsigned int op ) const;
std::wstring getArrowLength ( unsigned int op ) const; std::wstring getArrowLength ( unsigned int op ) const;
std::wstring getArrowWidth ( unsigned int op ) const; std::wstring getArrowWidth ( unsigned int op ) const;
std::wstring getFillMethod ( unsigned int p ) const; std::wstring getFillMethod ( unsigned int p ) const;
std::wstring getFillColorString( const unsigned char* p, unsigned int size ) const; std::wstring getFillColorString( const unsigned char* p, unsigned int size ) const;
/// Returns the OpenXML fill type of a fill effect
std::wstring getFillType ( unsigned int p ) const; std::wstring getFillType ( unsigned int p ) const;
std::wstring getShadowType ( unsigned int p ) const; std::wstring getShadowType ( unsigned int p ) const;
/// Returns the OpenXML wrap type of the shape
std::wstring getWrapType (const Spa* pSpa) const; std::wstring getWrapType (const Spa* pSpa) const;
std::wstring ParsePath (const std::list<OptionEntry>& options) const;
void WriteBeginShapeNode (const Shape* pShape); void WriteBeginShapeNode (const Shape* pShape);
void WriteEndShapeNode (const Shape* pShape); void WriteEndShapeNode (const Shape* pShape);
...@@ -121,9 +115,15 @@ namespace DocFileFormat ...@@ -121,9 +115,15 @@ namespace DocFileFormat
std::wstring GetLineFrom (const ChildAnchor* pAnchor) const; std::wstring GetLineFrom (const ChildAnchor* pAnchor) const;
std::wstring GetLineTo (const ChildAnchor* pAnchor) const; std::wstring GetLineTo (const ChildAnchor* pAnchor) const;
std::vector<std::wstring> GetTextRectangles(const OptionEntry& inscribe) const; std::wstring GetWrapCoords ( const OptionEntryPtr& pOpt ) const;
std::vector<std::wstring> GetTextRectangles ( const OptionEntryPtr& pOpt ) const;
std::wstring GetConnectAngles ( const OptionEntryPtr& pOpt ) const;
std::wstring GetConnectLocs ( const OptionEntryPtr& pOpt ) const;
void GetGuides ( const OptionEntryPtr& pOpt );
private: int m_nAdjValues[8];
std::vector<_guides> m_arrGuides;
bool m_isInlineShape; bool m_isInlineShape;
Spa* m_pSpa; Spa* m_pSpa;
IMapping* m_pCaller; IMapping* m_pCaller;
......
...@@ -45,6 +45,12 @@ ...@@ -45,6 +45,12 @@
#pragma comment(lib,"Shell32.lib") #pragma comment(lib,"Shell32.lib")
#pragma comment(lib,"Advapi32.lib") #pragma comment(lib,"Advapi32.lib")
#if defined(_WIN64)
#pragma comment(lib, "../../build/bin/icu/win_64/icuuc.lib")
#elif defined (_WIN32)
#pragma comment(lib, "../../build/bin/icu/win_32/icuuc.lib")
#endif
int _tmain(int argc, _TCHAR* argv[]) int _tmain(int argc, _TCHAR* argv[])
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
......
<?xml version="1.0" encoding="windows-1251"?> <?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8,00"
Name="XlsFormatTest" Name="XlsFormatTest"
ProjectGUID="{C2882DDD-07E6-4314-AD4B-48F43F38D722}" ProjectGUID="{C2882DDD-07E6-4314-AD4B-48F43F38D722}"
RootNamespace="ASCOfficeOdfFileTest" RootNamespace="ASCOfficeOdfFileTest"
...@@ -367,14 +367,6 @@ ...@@ -367,14 +367,6 @@
</FileConfiguration> </FileConfiguration>
</File> </File>
</Filter> </Filter>
<File
RelativePath="..\..\build\bin\icu\win_32\icudt.lib"
>
</File>
<File
RelativePath="..\..\build\bin\icu\win_32\icuuc.lib"
>
</File>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
......
...@@ -312,7 +312,7 @@ namespace NSCustomShapesConvert ...@@ -312,7 +312,7 @@ namespace NSCustomShapesConvert
if (lMaxF > m_arVertices[nIndex].x ) nGuideIndex_x = (DWORD)m_arVertices[nIndex].x - (DWORD)lMinF; if (lMaxF > m_arVertices[nIndex].x ) nGuideIndex_x = (DWORD)m_arVertices[nIndex].x - (DWORD)lMinF;
if (lMaxF > m_arVertices[nIndex].y ) nGuideIndex_y = (DWORD)m_arVertices[nIndex].y - (DWORD)lMinF; if (lMaxF > m_arVertices[nIndex].y ) nGuideIndex_y = (DWORD)m_arVertices[nIndex].y - (DWORD)lMinF;
if (nGuideIndex_x >= 0 ) if (nGuideIndex_x >= 0 && nGuideIndex_x < m_arGuides.size())
{ {
strPath += std::to_wstring(m_arGuides[nGuideIndex_x].m_param_value1) + L","; strPath += std::to_wstring(m_arGuides[nGuideIndex_x].m_param_value1) + L",";
} }
...@@ -320,7 +320,7 @@ namespace NSCustomShapesConvert ...@@ -320,7 +320,7 @@ namespace NSCustomShapesConvert
{ {
strPath += std::to_wstring(m_arVertices[nIndex].x) + L","; strPath += std::to_wstring(m_arVertices[nIndex].x) + L",";
} }
if (nGuideIndex_y >= 0) if (nGuideIndex_y >= 0 && nGuideIndex_y < m_arGuides.size())
{ {
strPath += std::to_wstring(m_arGuides[nGuideIndex_y].m_param_value1) + L","; strPath += std::to_wstring(m_arGuides[nGuideIndex_y].m_param_value1) + L",";
} }
...@@ -388,7 +388,7 @@ namespace NSCustomShapesConvert ...@@ -388,7 +388,7 @@ namespace NSCustomShapesConvert
if (lMaxF > m_arVertices[nV].x ) nGuideIndex_x = (DWORD)m_arVertices[nV].x - (DWORD)lMinF; if (lMaxF > m_arVertices[nV].x ) nGuideIndex_x = (DWORD)m_arVertices[nV].x - (DWORD)lMinF;
if (lMaxF > m_arVertices[nV].y ) nGuideIndex_y = (DWORD)m_arVertices[nV].y - (DWORD)lMinF; if (lMaxF > m_arVertices[nV].y ) nGuideIndex_y = (DWORD)m_arVertices[nV].y - (DWORD)lMinF;
if (nGuideIndex_x >= 0 ) if (nGuideIndex_x >= 0 && nGuideIndex_x < m_arGuides.size() )
{ {
strPath += std::to_wstring(m_arGuides[nGuideIndex_x].m_param_value1) + L","; strPath += std::to_wstring(m_arGuides[nGuideIndex_x].m_param_value1) + L",";
} }
...@@ -396,7 +396,7 @@ namespace NSCustomShapesConvert ...@@ -396,7 +396,7 @@ namespace NSCustomShapesConvert
{ {
strPath += std::to_wstring(m_arVertices[nV].x) + L","; strPath += std::to_wstring(m_arVertices[nV].x) + L",";
} }
if (nGuideIndex_y >= 0) if (nGuideIndex_y >= 0 && nGuideIndex_y < m_arGuides.size())
{ {
strPath += std::to_wstring(m_arGuides[nGuideIndex_y].m_param_value1) + L","; strPath += std::to_wstring(m_arGuides[nGuideIndex_y].m_param_value1) + L",";
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment