src/lib/CDRContentCollector.cpp | 9 +- src/lib/CDRParser.cpp | 142 ++++++++++++++++++---------------------- src/lib/CDRTypes.h | 13 ++- 3 files changed, 81 insertions(+), 83 deletions(-)
New commits: commit 7b9388dcbca9c176e556c8b67138593d4d98a116 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Wed Apr 10 10:32:26 2013 +0200 The indents don't seem to be really giving anything coherent diff --git a/src/lib/CDRContentCollector.cpp b/src/lib/CDRContentCollector.cpp index 2de80ae..fa905d3 100644 --- a/src/lib/CDRContentCollector.cpp +++ b/src/lib/CDRContentCollector.cpp @@ -479,9 +479,9 @@ void libcdr::CDRContentCollector::_flushCurrentPath() default: break; } - paraProps.insert("fo:text-indent", (*m_currentText)[i].m_charStyle.m_firstIndent); - paraProps.insert("fo:margin-left", (*m_currentText)[i].m_charStyle.m_leftIndent); - paraProps.insert("fo:margin-right", (*m_currentText)[i].m_charStyle.m_rightIndent); +// paraProps.insert("fo:text-indent", (*m_currentText)[i].m_charStyle.m_firstIndent); +// paraProps.insert("fo:margin-left", (*m_currentText)[i].m_charStyle.m_leftIndent); +// paraProps.insert("fo:margin-right", (*m_currentText)[i].m_charStyle.m_rightIndent); outputElement.addStartTextLine(paraProps); WPXPropertyList spanProps; double fontSize = (double)cdr_round(144.0*(*m_currentText)[i].m_charStyle.m_fontSize) / 2.0; commit d9834c77f04db7680118789b21ef27140911426a Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Wed Apr 10 09:34:33 2013 +0200 Improve readability diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp index fdc7699..097226a 100644 --- a/src/lib/CDRParser.cpp +++ b/src/lib/CDRParser.cpp @@ -47,6 +47,33 @@ #define M_PI 3.14159265358979323846 #endif +// The local variable name and CDRStltRecord member name have to be identical +// for this macro to work + +#define CDR_EXTRACT(membername) \ + if (iter->second.membername) \ + membername = iter->second.membername; \ + else if (iter->second.parentId) \ + { \ + unsigned parentId = iter->second.parentId; \ + while (true) \ + { \ + std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); \ + if (iter2 == styles.end()) \ + break; \ + if (iter2->second.membername) \ + { \ + membername = iter2->second.membername; \ + break; \ + } \ + if (iter2->second.parentId) \ + parentId = iter2->second.parentId; \ + else \ + break; \ + } \ + } + + namespace { @@ -2578,134 +2605,30 @@ void libcdr::CDRParser::readStlt(WPXInputStream *input, unsigned length) for (std::map<unsigned, CDRStltRecord>::const_iterator iter = styles.begin(); iter != styles.end(); ++iter) { - unsigned fontRecordId = 0; - if (iter->second.fontRecId) - fontRecordId = iter->second.fontRecId; - else if (iter->second.parentId) - { - unsigned parentId = iter->second.parentId; - while (true) - { - std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); - if (iter2 == styles.end()) - break; - if (iter2->second.fontRecId) - { - fontRecordId = iter2->second.fontRecId; - break; - } - if (iter2->second.parentId) - parentId = iter2->second.parentId; - else - break; - } - } - unsigned alignId = 0; - if (iter->second.alignId) - alignId = iter->second.alignId; - else if (iter->second.parentId) + unsigned fontRecId = 0; + CDR_EXTRACT(fontRecId) + if (fontRecId) { - unsigned parentId = iter->second.parentId; - while (true) - { - std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); - if (iter2 == styles.end()) - break; - if (iter2->second.alignId) - { - alignId = iter2->second.alignId; - break; - } - if (iter2->second.parentId) - parentId = iter2->second.parentId; - else - break; - } - } - unsigned indentId = 0; - if (iter->second.indentId) - indentId = iter->second.indentId; - else if (iter->second.parentId) - { - unsigned parentId = iter->second.parentId; - while (true) - { - std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); - if (iter2 == styles.end()) - break; - if (iter2->second.indentId) - { - indentId = iter2->second.indentId; - break; - } - if (iter2->second.parentId) - parentId = iter2->second.parentId; - else - break; - } - } - unsigned fillId = 0; - if (iter->second.fillId) - fillId = iter->second.fillId; - else if (iter->second.parentId) - { - unsigned parentId = iter->second.parentId; - while (true) - { - std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); - if (iter2 == styles.end()) - break; - if (iter2->second.fillId) - { - fillId = iter2->second.fillId; - break; - } - if (iter2->second.parentId) - parentId = iter2->second.parentId; - else - break; - } - } - unsigned outlId = 0; - if (iter->second.outlId) - outlId = iter->second.outlId; - else if (iter->second.parentId) - { - unsigned parentId = iter->second.parentId; - while (true) - { - std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); - if (iter2 == styles.end()) - break; - if (iter2->second.outlId) - { - outlId = iter2->second.outlId; - break; - } - if (iter2->second.parentId) - parentId = iter2->second.parentId; - else - break; - } - } - if (fontRecordId) - { - std::map<unsigned, unsigned short>::const_iterator iterFontId = fontIds.find(fontRecordId); + std::map<unsigned, unsigned short>::const_iterator iterFontId = fontIds.find(fontRecId); if (iterFontId != fontIds.end()) tmpCharStyle.m_fontId = iterFontId->second; - std::map<unsigned, unsigned short>::const_iterator iterCharSet = fontEncodings.find(fontRecordId); + std::map<unsigned, unsigned short>::const_iterator iterCharSet = fontEncodings.find(fontRecId); if (iterCharSet != fontEncodings.end()) tmpCharStyle.m_charSet = iterCharSet->second; - std::map<unsigned, double>::const_iterator iterFontSize = fontSizes.find(fontRecordId); + std::map<unsigned, double>::const_iterator iterFontSize = fontSizes.find(fontRecId); if (iterFontSize != fontSizes.end()) tmpCharStyle.m_fontSize = iterFontSize->second; } + unsigned alignId = 0; + CDR_EXTRACT(alignId); if (alignId) { std::map<unsigned, unsigned>::const_iterator iterAlign = aligns.find(alignId); if (iterAlign != aligns.end()) tmpCharStyle.m_align = iterAlign->second; } + unsigned indentId = 0; + CDR_EXTRACT(indentId); if (indentId) { std::map<unsigned, double>::const_iterator iterRight = rightIndents.find(indentId); @@ -2718,12 +2641,16 @@ void libcdr::CDRParser::readStlt(WPXInputStream *input, unsigned length) if (iterLeft != leftIndents.end()) tmpCharStyle.m_leftIndent = iterLeft->second; } + unsigned fillId = 0; + CDR_EXTRACT(fillId); if (fillId) { std::map<unsigned, unsigned>::const_iterator iterFill = fillIds.find(fillId); if (iterFill != fillIds.end()) tmpCharStyle.m_fillId = iterFill->second; } + unsigned outlId = 0; + CDR_EXTRACT(outlId); if (outlId) { std::map<unsigned, unsigned>::const_iterator iterOutl = outlIds.find(outlId); commit f46ff71bb5cf18301caa8768f164c0cd06b12d50 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Wed Apr 10 09:10:26 2013 +0200 BIPU support of text colour diff --git a/src/lib/CDRContentCollector.cpp b/src/lib/CDRContentCollector.cpp index 502cf65..2de80ae 100644 --- a/src/lib/CDRContentCollector.cpp +++ b/src/lib/CDRContentCollector.cpp @@ -489,6 +489,9 @@ void libcdr::CDRContentCollector::_flushCurrentPath() std::map<unsigned, CDRFont>::const_iterator iterFont = m_ps.m_fonts.find((*m_currentText)[i].m_charStyle.m_fontId); if (iterFont != m_ps.m_fonts.end()) spanProps.insert("style:font-name", iterFont->second.m_name); + std::map<unsigned, CDRFillStyle>::const_iterator iterFill = m_ps.m_fillStyles.find((*m_currentText)[i].m_charStyle.m_fillId); + if (iterFill != m_ps.m_fillStyles.end()) + spanProps.insert("fo:color", m_ps.getRGBColorString(iterFill->second.color1)); outputElement.addStartTextSpan(spanProps); outputElement.addInsertText((*m_currentText)[i].m_text); outputElement.addEndTextSpan(); diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp index 6cc31de..fdc7699 100644 --- a/src/lib/CDRParser.cpp +++ b/src/lib/CDRParser.cpp @@ -2410,17 +2410,23 @@ void libcdr::CDRParser::readStlt(WPXInputStream *input, unsigned length) unsigned numFills = readU32(input); CDR_DEBUG_MSG(("CDRParser::readStlt numFills 0x%x\n", numFills)); unsigned i = 0; + std::map<unsigned, unsigned> fillIds; for (i=0; i<numFills; ++i) { - input->seek(12, WPX_SEEK_CUR); + unsigned fillId = readU32(input); + input->seek(4, WPX_SEEK_CUR); + fillIds[fillId] = readU32(input); if (m_version >= 1300) input->seek(48, WPX_SEEK_CUR); } unsigned numOutls = readU32(input); CDR_DEBUG_MSG(("CDRParser::readStlt numOutls 0x%x\n", numOutls)); + std::map<unsigned, unsigned> outlIds; for (i=0; i<numOutls; ++i) { - input->seek(12, WPX_SEEK_CUR); + unsigned outlId = readU32(input); + input->seek(4, WPX_SEEK_CUR); + outlIds[outlId] = readU32(input); } unsigned numFonts = readU32(input); CDR_DEBUG_MSG(("CDRParser::readStlt numFonts 0x%x\n", numFonts)); @@ -2638,6 +2644,50 @@ void libcdr::CDRParser::readStlt(WPXInputStream *input, unsigned length) break; } } + unsigned fillId = 0; + if (iter->second.fillId) + fillId = iter->second.fillId; + else if (iter->second.parentId) + { + unsigned parentId = iter->second.parentId; + while (true) + { + std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); + if (iter2 == styles.end()) + break; + if (iter2->second.fillId) + { + fillId = iter2->second.fillId; + break; + } + if (iter2->second.parentId) + parentId = iter2->second.parentId; + else + break; + } + } + unsigned outlId = 0; + if (iter->second.outlId) + outlId = iter->second.outlId; + else if (iter->second.parentId) + { + unsigned parentId = iter->second.parentId; + while (true) + { + std::map<unsigned, CDRStltRecord>::const_iterator iter2 = styles.find(parentId); + if (iter2 == styles.end()) + break; + if (iter2->second.outlId) + { + outlId = iter2->second.outlId; + break; + } + if (iter2->second.parentId) + parentId = iter2->second.parentId; + else + break; + } + } if (fontRecordId) { std::map<unsigned, unsigned short>::const_iterator iterFontId = fontIds.find(fontRecordId); @@ -2668,6 +2718,18 @@ void libcdr::CDRParser::readStlt(WPXInputStream *input, unsigned length) if (iterLeft != leftIndents.end()) tmpCharStyle.m_leftIndent = iterLeft->second; } + if (fillId) + { + std::map<unsigned, unsigned>::const_iterator iterFill = fillIds.find(fillId); + if (iterFill != fillIds.end()) + tmpCharStyle.m_fillId = iterFill->second; + } + if (outlId) + { + std::map<unsigned, unsigned>::const_iterator iterOutl = outlIds.find(outlId); + if (iterOutl != outlIds.end()) + tmpCharStyle.m_outlId = iterOutl->second; + } charStyles[iter->first] = tmpCharStyle; } } @@ -2771,9 +2833,8 @@ void libcdr::CDRParser::readTxsm(WPXInputStream *input, unsigned length) // Read more information depending on the flags if (fl2&1) // Font { - unsigned flag = readU32(input); - charStyle.m_charSet = (flag >> 16); - charStyle.m_fontId = flag & 0xff; + charStyle.m_fontId = readU16(input); + charStyle.m_charSet = readU16(input); } if (fl2&2) // Bold/Italic, etc. input->seek(4, WPX_SEEK_CUR); @@ -2787,12 +2848,12 @@ void libcdr::CDRParser::readTxsm(WPXInputStream *input, unsigned length) input->seek(4, WPX_SEEK_CUR); if (fl2&0x40) // Font Colour { - input->seek(4, WPX_SEEK_CUR); + charStyle.m_fillId = readU32(input); if (m_version >= 1500) input->seek(48, WPX_SEEK_CUR); } if (fl2&0x80) // Font Outl Colour - input->seek(4, WPX_SEEK_CUR); + charStyle.m_outlId = readU32(input); if (fl3&8) // Encoding { diff --git a/src/lib/CDRTypes.h b/src/lib/CDRTypes.h index aa5b946..4579df7 100644 --- a/src/lib/CDRTypes.h +++ b/src/lib/CDRTypes.h @@ -157,13 +157,16 @@ struct CDRCharacterStyle double m_fontSize; unsigned m_align; double m_leftIndent, m_firstIndent, m_rightIndent; + unsigned m_outlId, m_fillId; CDRCharacterStyle() : m_charSet(0), m_fontId(0), m_fontSize(0.0), m_align(0), m_leftIndent(0.0), m_firstIndent(0.0), - m_rightIndent(0.0) {} + m_rightIndent(0.0), m_outlId(0), m_fillId(0) {} CDRCharacterStyle(unsigned short charSet, unsigned short fontId, double fontSize, unsigned align, - double leftIndent, double firstIndent, double rightIndent) + double leftIndent, double firstIndent, double rightIndent, unsigned outlId, + unsigned fillId) : m_charSet(charSet), m_fontId(fontId), m_fontSize(fontSize), m_align(align), - m_leftIndent(leftIndent), m_firstIndent(firstIndent), m_rightIndent(rightIndent) {} + m_leftIndent(leftIndent), m_firstIndent(firstIndent), m_rightIndent(rightIndent), + m_outlId(outlId), m_fillId(fillId) {} void overrideCharacterStyle(const CDRCharacterStyle &override) { if (override.m_charSet || override.m_fontId) @@ -181,6 +184,10 @@ struct CDRCharacterStyle m_firstIndent = override.m_firstIndent; m_rightIndent = override.m_rightIndent; } + if (override.m_outlId) + m_outlId = override.m_outlId; + if (override.m_fillId) + m_fillId = override.m_fillId; } };
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits