Author: alg Date: Tue Jun 18 09:44:12 2013 New Revision: 1494084 URL: http://svn.apache.org/r1494084 Log: i122524 fixed/added some text import aspects for super/sub-baseline
Modified: openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx openoffice/trunk/main/svgio/inc/svgio/svgreader/svgtoken.hxx openoffice/trunk/main/svgio/source/svgreader/svgcharacternode.cxx openoffice/trunk/main/svgio/source/svgreader/svgdocumenthandler.cxx openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx openoffice/trunk/main/svgio/source/svgreader/svgtoken.cxx Modified: openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx?rev=1494084&r1=1494083&r2=1494084&view=diff ============================================================================== --- openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx (original) +++ openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx Tue Jun 18 09:44:12 2013 @@ -146,6 +146,15 @@ namespace svgio FillRule_evenodd }; + enum BaselineShift + { + BaselineShift_Baseline, + BaselineShift_Sub, + BaselineShift_Super, + BaselineShift_Percentage, + BaselineShift_Length + }; + class SvgStyleAttributes { private: @@ -199,6 +208,10 @@ namespace svgio // ClipRule setting (only valid wne mbIsClipPathContent == true, default is FillRule_nonzero) FillRule maClipRule; + // BaselineShift: Type and number (in case of BaselineShift_Percentage or BaselineShift_Length) + BaselineShift maBaselineShift; + SvgNumber maBaselineShiftNumber; + /// bitfield // defines if this attributes are part of a ClipPath. If yes, @@ -425,6 +438,11 @@ namespace svgio const SvgMarkerNode* accessMarkerEndXLink() const; void setMarkerEndXLink(const rtl::OUString& rNew) { maMarkerEndXLink = rNew; } + // BaselineShift + void setBaselineShift(const BaselineShift aBaselineShift = BaselineShift_Baseline) { maBaselineShift = aBaselineShift; } + BaselineShift getBaselineShift() const { return maBaselineShift; } + void setBaselineShiftNumber(const SvgNumber& rBaselineShift = SvgNumber()) { maBaselineShiftNumber = rBaselineShift; } + SvgNumber getBaselineShiftNumber() const; }; } // end of namespace svgreader } // end of namespace svgio Modified: openoffice/trunk/main/svgio/inc/svgio/svgreader/svgtoken.hxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/inc/svgio/svgreader/svgtoken.hxx?rev=1494084&r1=1494083&r2=1494084&view=diff ============================================================================== --- openoffice/trunk/main/svgio/inc/svgio/svgreader/svgtoken.hxx (original) +++ openoffice/trunk/main/svgio/inc/svgio/svgreader/svgtoken.hxx Tue Jun 18 09:44:12 2013 @@ -181,6 +181,7 @@ namespace svgio // text tokens SVGTokenText, + SVGTokenBaselineShift, SVGTokenLast }; Modified: openoffice/trunk/main/svgio/source/svgreader/svgcharacternode.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgcharacternode.cxx?rev=1494084&r1=1494083&r2=1494084&view=diff ============================================================================== --- openoffice/trunk/main/svgio/source/svgreader/svgcharacternode.cxx (original) +++ openoffice/trunk/main/svgio/source/svgreader/svgcharacternode.cxx Tue Jun 18 09:44:12 2013 @@ -408,6 +408,38 @@ namespace svgio } } + // get BaselineShift + const BaselineShift aBaselineShift(rSvgStyleAttributes.getBaselineShift()); + + // apply BaselineShift + switch(aBaselineShift) + { + case BaselineShift_Sub: + { + aPosition.setY(aPosition.getY() + aTextLayouterDevice.getUnderlineOffset()); + break; + } + case BaselineShift_Super: + { + aPosition.setY(aPosition.getY() + aTextLayouterDevice.getOverlineOffset()); + break; + } + case BaselineShift_Percentage: + case BaselineShift_Length: + { + const SvgNumber aNumber(rSvgStyleAttributes.getBaselineShiftNumber()); + const double mfBaselineShift(aNumber.solve(*this, length)); + + aPosition.setY(aPosition.getY() + mfBaselineShift); + break; + } + default: // BaselineShift_Baseline + { + // nothing to do + break; + } + } + // get fill color const basegfx::BColor aFill(rSvgStyleAttributes.getFill() ? *rSvgStyleAttributes.getFill() Modified: openoffice/trunk/main/svgio/source/svgreader/svgdocumenthandler.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgdocumenthandler.cxx?rev=1494084&r1=1494083&r2=1494084&view=diff ============================================================================== --- openoffice/trunk/main/svgio/source/svgreader/svgdocumenthandler.cxx (original) +++ openoffice/trunk/main/svgio/source/svgreader/svgdocumenthandler.cxx Tue Jun 18 09:44:12 2013 @@ -86,9 +86,29 @@ namespace { if(pLast) { + bool bAddGap(true); + static bool bNoGapsForBaselineShift(true); + + if(bNoGapsForBaselineShift) + { + // With this option a baseline shift between two char parts ('words') + // will not add a space 'gap' to the end of the (non-last) word. This + // seems to be the standard behaviour, see last bugdoc attached #122524# + const svgio::svgreader::SvgStyleAttributes* pStyleLast = pLast->getSvgStyleAttributes(); + const svgio::svgreader::SvgStyleAttributes* pStyleCurrent = pCandidate->getSvgStyleAttributes(); + + if(pStyleLast && pStyleCurrent && pStyleLast->getBaselineShift() != pStyleCurrent->getBaselineShift()) + { + bAddGap = false; + } + } + // add in-between whitespace (single space) to last // known character node - pLast->addGap(); + if(bAddGap) + { + pLast->addGap(); + } } // remember new last corected character node Modified: openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx?rev=1494084&r1=1494083&r2=1494084&view=diff ============================================================================== --- openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx (original) +++ openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx Tue Jun 18 09:44:12 2013 @@ -210,7 +210,7 @@ namespace svgio } else { - parseAttribute(aTokenName, StrToSVGToken(aTokenName), xAttribs->getValueByIndex(a)); + parseAttribute(aTokenName, aSVGToken, xAttribs->getValueByIndex(a)); } } Modified: openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx?rev=1494084&r1=1494083&r2=1494084&view=diff ============================================================================== --- openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx (original) +++ openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx Tue Jun 18 09:44:12 2013 @@ -1169,6 +1169,8 @@ namespace svgio mpMarkerEndXLink(0), maFillRule(FillRule_notset), maClipRule(FillRule_nonzero), + maBaselineShift(BaselineShift_Baseline), + maBaselineShiftNumber(0), mbIsClipPathContent(SVGTokenClipPathNode == mrOwner.getType()), mbStrokeDasharraySet(false) { @@ -1803,6 +1805,43 @@ namespace svgio } break; } + case SVGTokenBaselineShift: + { + if(aContent.getLength()) + { + static rtl::OUString aStrSub(rtl::OUString::createFromAscii("sub")); + static rtl::OUString aStrSuper(rtl::OUString::createFromAscii("super")); + SvgNumber aNum; + + if(aContent.match(aStrSub)) + { + setBaselineShift(BaselineShift_Sub); + } + else if(aContent.match(aStrSuper)) + { + setBaselineShift(BaselineShift_Super); + } + else if(readSingleNumber(aContent, aNum)) + { + setBaselineShiftNumber(aNum); + + if(Unit_percent == aNum.getUnit()) + { + setBaselineShift(BaselineShift_Percentage); + } + else + { + setBaselineShift(BaselineShift_Length); + } + } + else + { + // no BaselineShift or inherit (which is automatically) + setBaselineShift(BaselineShift_Baseline); + } + } + break; + } default: { break; @@ -2184,6 +2223,24 @@ namespace svgio { if(maFontSize.isSet()) { + // #122524# Handle Unit_percent realtive to parent FontSize (see SVG1.1 + // spec 10.10 Font selection properties font-size, lastline (klick 'normative + // definition of the property') + if(Unit_percent == maFontSize.getUnit()) + { + const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); + + if(pSvgStyleAttributes) + { + const SvgNumber aParentNumber = pSvgStyleAttributes->getFontSize(); + + return SvgNumber( + aParentNumber.getNumber() * maFontSize.getNumber() * 0.01, + aParentNumber.getUnit(), + true); + } + } + return maFontSize; } @@ -2472,6 +2529,26 @@ namespace svgio return mpMarkerEndXLink; } + SvgNumber SvgStyleAttributes::getBaselineShiftNumber() const + { + // #122524# Handle Unit_percent realtive to parent BaselineShift + if(Unit_percent == maBaselineShiftNumber.getUnit()) + { + const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); + + if(pSvgStyleAttributes) + { + const SvgNumber aParentNumber = pSvgStyleAttributes->getBaselineShiftNumber(); + + return SvgNumber( + aParentNumber.getNumber() * maBaselineShiftNumber.getNumber() * 0.01, + aParentNumber.getUnit(), + true); + } + } + + return maBaselineShiftNumber; + } } // end of namespace svgreader } // end of namespace svgio Modified: openoffice/trunk/main/svgio/source/svgreader/svgtoken.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgtoken.cxx?rev=1494084&r1=1494083&r2=1494084&view=diff ============================================================================== --- openoffice/trunk/main/svgio/source/svgreader/svgtoken.cxx (original) +++ openoffice/trunk/main/svgio/source/svgreader/svgtoken.cxx Tue Jun 18 09:44:12 2013 @@ -165,6 +165,7 @@ namespace svgio static rtl::OUString aSVGStrStrokeWidth(rtl::OUString::createFromAscii("stroke-width")); static rtl::OUString aSVGStrText(rtl::OUString::createFromAscii("text")); + static rtl::OUString aSVGStrBaselineShift(rtl::OUString::createFromAscii("baseline-shift")); SVGToken StrToSVGToken(const rtl::OUString& rStr) { @@ -307,6 +308,7 @@ namespace svgio aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrStrokeWidth, SVGTokenStrokeWidth)); aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrText, SVGTokenText)); + aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrBaselineShift, SVGTokenBaselineShift)); } const SVGTokenMapper::const_iterator aResult(aSVGTokenMapperList.find(rStr));