src/lib/CDRContentCollector.cpp | 73 +++++++++++++++++++++++++--------------- src/lib/CDRContentCollector.h | 5 +- src/lib/libcdr_utils.cpp | 5 ++ 3 files changed, 53 insertions(+), 30 deletions(-)
New commits: commit 319e9581a0a7b7507fc998dd3a9d205b95a46588 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Tue Mar 5 13:04:56 2013 +0100 Ugly hackery to try to get the text position right diff --git a/src/lib/CDRContentCollector.cpp b/src/lib/CDRContentCollector.cpp index 840f164..bd3beb4 100644 --- a/src/lib/CDRContentCollector.cpp +++ b/src/lib/CDRContentCollector.cpp @@ -52,10 +52,9 @@ libcdr::CDRContentCollector::CDRContentCollector(libcdr::CDRParserState &ps, lib m_isPageProperties(false), m_isPageStarted(false), m_ignorePage(false), m_page(ps.m_pages[0]), m_pageIndex(0), m_currentFildId(0), m_currentOutlId(0), m_spnd(0), m_currentObjectLevel(0), m_currentGroupLevel(0), m_currentVectLevel(0), m_currentPageLevel(0), - m_currentImage(), m_currentText(0), m_currentTextOffsetX(0.0), m_currentTextOffsetY(0.0), - m_currentBox(), m_currentPath(), m_currentTransforms(), m_fillTransforms(), - m_polygon(0), m_isInPolygon(false), m_isInSpline(false), m_outputElements(0), - m_contentOutputElements(), m_fillOutputElements(), + m_currentImage(), m_currentText(0), m_currentBBox(), m_currentTextBox(), m_currentPath(), + m_currentTransforms(), m_fillTransforms(), m_polygon(0), m_isInPolygon(false), m_isInSpline(false), + m_outputElements(0), m_contentOutputElements(), m_fillOutputElements(), m_groupLevels(), m_groupTransforms(), m_splineData(), m_fillOpacity(1.0), m_ps(ps) { m_outputElements = &m_contentOutputElements; @@ -111,7 +110,7 @@ void libcdr::CDRContentCollector::collectObject(unsigned level) m_currentObjectLevel = level; m_currentFildId = 0; m_currentOutlId = 0; - m_currentBox = CDRBox(); + m_currentBBox = CDRBox(); } void libcdr::CDRContentCollector::collectGroup(unsigned level) @@ -393,25 +392,44 @@ void libcdr::CDRContentCollector::_flushCurrentPath() } if (m_currentText && !m_currentText->empty()) { - double currentTextOffsetX = 0.0; - double currentTextOffsetY = 0.0; - m_currentTransforms.applyToPoint(currentTextOffsetX, currentTextOffsetY); - if (!m_groupTransforms.empty()) - m_groupTransforms.top().applyToPoint(currentTextOffsetX, currentTextOffsetY); - WPXPropertyList textFrameProps; - if (m_currentBox.getWidth() > 0.0 && m_currentBox.getHeight() > 0.0) + double x1 = m_currentTextBox.m_x; + double y1 = m_currentTextBox.m_y; + double x2 = m_currentTextBox.m_x + m_currentTextBox.m_w; + double y2 = m_currentTextBox.m_y - m_currentTextBox.m_h; + if (m_currentTextBox.m_h != 0.0 && m_currentTextBox.m_w != 0) { - textFrameProps.insert("svg:width", m_currentBox.getWidth() * 1.05); - textFrameProps.insert("svg:height", m_currentBox.getHeight()); - currentTextOffsetX = m_currentBox.getMinX(); - currentTextOffsetY = m_currentBox.getMinY(); + m_currentTransforms.applyToPoint(x1, y1); + m_currentTransforms.applyToPoint(x2, y2); + if (!m_groupTransforms.empty()) + { + m_groupTransforms.top().applyToPoint(x1, y1); + m_groupTransforms.top().applyToPoint(x2, y2); + } } + else if (m_currentBBox.getWidth() != 0.0 && m_currentBBox.getHeight() != 0.0) + { + x1 = m_currentBBox.getMinX(); + y1 = m_currentBBox.getMinY(); + x2 = m_currentBBox.getMinX() + m_currentBBox.getWidth(); + y2 = m_currentBBox.getMinY() + m_currentBBox.getHeight(); + } + CDRTransform tmpTrafo(1.0, 0.0, -m_page.offsetX, 0.0, 1.0, -m_page.offsetY); - tmpTrafo.applyToPoint(currentTextOffsetX, currentTextOffsetY); + tmpTrafo.applyToPoint(x1, y1); + tmpTrafo.applyToPoint(x2, y2); tmpTrafo = CDRTransform(1.0, 0.0, 0.0, 0.0, -1.0, m_page.height); - tmpTrafo.applyToPoint(currentTextOffsetX, currentTextOffsetY); - textFrameProps.insert("svg:x", currentTextOffsetX); - textFrameProps.insert("svg:y", currentTextOffsetY - m_currentBox.getHeight()); + tmpTrafo.applyToPoint(x1, y1); + tmpTrafo.applyToPoint(x2, y2); + if (x1 > x2) + std::swap(x1, x2); + if (y1 > y2) + std::swap(y1, y2); + + WPXPropertyList textFrameProps; + textFrameProps.insert("svg:width", fabs(x2-x1)); + textFrameProps.insert("svg:height", fabs(y2-y1)); + textFrameProps.insert("svg:x", x1); + textFrameProps.insert("svg:y", y1); textFrameProps.insert("fo:padding-top", 0.0); textFrameProps.insert("fo:padding-bottom", 0.0); textFrameProps.insert("fo:padding-left", 0.0); @@ -1094,7 +1112,7 @@ void libcdr::CDRContentCollector::collectBBox(double x0, double y0, double x1, d m_page.offsetX = bBox.getMinX(); m_page.offsetY = bBox.getMinY(); } - m_currentBox = bBox; + m_currentBBox = bBox; } void libcdr::CDRContentCollector::collectSpnd(unsigned spnd) @@ -1137,18 +1155,21 @@ void libcdr::CDRContentCollector::collectVectorPattern(unsigned id, const WPXBin #endif } -void libcdr::CDRContentCollector::collectArtisticText(double, double) +void libcdr::CDRContentCollector::collectArtisticText(double x, double y) { - m_currentBox.m_w *= 2.0; + m_currentTextBox = CDRBox(x, y, x, y); + m_currentBBox.m_w *= 2.0; std::map<unsigned, std::vector<CDRText> >::const_iterator iter = m_ps.m_texts.find(m_spnd); if (iter != m_ps.m_texts.end()) m_currentText = &(iter->second); } -void libcdr::CDRContentCollector::collectParagraphText(double, double, double width, double height) +void libcdr::CDRContentCollector::collectParagraphText(double x, double y, double width, double height) { - m_currentBox.m_w = width; - m_currentBox.m_h = height; + m_currentTextBox.m_x = x; + m_currentTextBox.m_y = y; + m_currentTextBox.m_w = width; + m_currentTextBox.m_h = height; std::map<unsigned, std::vector<CDRText> >::const_iterator iter = m_ps.m_texts.find(m_spnd); if (iter != m_ps.m_texts.end()) m_currentText = &(iter->second); diff --git a/src/lib/CDRContentCollector.h b/src/lib/CDRContentCollector.h index 5781d25..ba0cd28 100644 --- a/src/lib/CDRContentCollector.h +++ b/src/lib/CDRContentCollector.h @@ -119,9 +119,8 @@ private: unsigned m_currentObjectLevel, m_currentGroupLevel, m_currentVectLevel, m_currentPageLevel; CDRImage m_currentImage; const std::vector<CDRText> *m_currentText; - double m_currentTextOffsetX; - double m_currentTextOffsetY; - CDRBox m_currentBox; + CDRBox m_currentBBox; + CDRBox m_currentTextBox; CDRPath m_currentPath; CDRTransforms m_currentTransforms; commit 87306508378794439babaace5cdca49e7905da4d Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Tue Mar 5 13:04:33 2013 +0100 Guess the encoding only if text is reasonably long diff --git a/src/lib/libcdr_utils.cpp b/src/lib/libcdr_utils.cpp index 5d9fa81..510aed6 100644 --- a/src/lib/libcdr_utils.cpp +++ b/src/lib/libcdr_utils.cpp @@ -114,7 +114,10 @@ static unsigned short getEncodingFromICUName(const char *name) static unsigned short getEncoding(const unsigned char *buffer, unsigned bufferLength) { - if (!buffer || !bufferLength) + if (!buffer || bufferLength < 30) + // Under 30, we get a lot of bogus information + // Eventually first verify whether the encoding 0 is plausible + // and only if not continue guessing ???? return 0; UErrorCode status = U_ZERO_ERROR; UCharsetDetector *csd = 0;
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits