editeng/source/editeng/editattr.cxx | 8 ++------ editeng/source/editeng/editdoc.cxx | 6 +----- editeng/source/editeng/impedit4.cxx | 14 ++++++++++++-- editeng/source/items/svxfont.cxx | 31 +++++++++++++++++++++++++++++++ include/editeng/svxfont.hxx | 2 ++ 5 files changed, 48 insertions(+), 13 deletions(-)
New commits: commit 0f29d36aa9e6ac7d0914a6e1749c16ecec216904 Author: Justin Luth <justin_l...@sil.org> AuthorDate: Sat Mar 14 14:45:39 2020 +0300 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Fri Apr 3 10:04:56 2020 +0200 tdf#80194 autoEsc: use fontmetrics in calculation This replaces the previous 7.0 patch in commit 2940d1905b921d9909b08b1e32014d3c44474ef0 where the following is still true: THIS WILL CHANGE THE POSITION OF EDITENG SUBSCRIPTS AND SUPERSCRIPTS IN EXISTING DOCUMENTS! That is because they were very poorly placed before - using a formula that is very different from how Writer does it. Everyone in the bug reports indicates that Writer does it good, but Impress does it really bad. (tdf#89849, tdf#63083). Instead of using the previous patch's 80%/20% generalization, copy Writer's use of the actual ascent and descent of the font to determine the best position for the subscript or superscript. Change-Id: I0f10f6174b0709f3bc3b9acdc54b7b1fd59c5ee2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90489 Reviewed-by: Justin Luth <justin_l...@sil.org> Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Justin Luth <justin_l...@sil.org> diff --git a/editeng/source/editeng/editattr.cxx b/editeng/source/editeng/editattr.cxx index a99e4d496f74..e48445c27c30 100644 --- a/editeng/source/editeng/editattr.cxx +++ b/editeng/source/editeng/editattr.cxx @@ -266,17 +266,13 @@ EditCharAttribEscapement::EditCharAttribEscapement( const SvxEscapementItem& rAt assert(rAttr.Which() == EE_CHAR_ESCAPEMENT); } -void EditCharAttribEscapement::SetFont( SvxFont& rFont, OutputDevice* ) +void EditCharAttribEscapement::SetFont( SvxFont& rFont, OutputDevice* pOutDev ) { sal_uInt16 const nProp = static_cast<const SvxEscapementItem*>(GetItem())->GetProportionalHeight(); rFont.SetPropr( static_cast<sal_uInt8>(nProp) ); short nEsc = static_cast<const SvxEscapementItem*>(GetItem())->GetEsc(); - if ( nEsc == DFLT_ESC_AUTO_SUPER ) - nEsc = .8 * (100 - nProp); - else if ( nEsc == DFLT_ESC_AUTO_SUB ) - nEsc = .2 * -(100 - nProp); - rFont.SetEscapement( nEsc ); + rFont.SetNonAutoEscapement( nEsc, pOutDev ); } diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx index 42fc1f3cc22c..9e9eb17e6177 100644 --- a/editeng/source/editeng/editdoc.cxx +++ b/editeng/source/editeng/editdoc.cxx @@ -2007,11 +2007,7 @@ void CreateFont( SvxFont& rFont, const SfxItemSet& rSet, bool bSearchInParent, S rFont.SetPropr( static_cast<sal_uInt8>(nProp) ); short nEsc = rEsc.GetEsc(); - if ( nEsc == DFLT_ESC_AUTO_SUPER ) - nEsc = .8 * (100 - nProp); - else if ( nEsc == DFLT_ESC_AUTO_SUB ) - nEsc = .2 * -(100 - nProp); - rFont.SetEscapement( nEsc ); + rFont.SetNonAutoEscapement( nEsc ); } if ( bSearchInParent || ( rSet.GetItemState( EE_CHAR_PAIRKERNING ) == SfxItemState::SET ) ) rFont.SetKerning( rSet.Get( EE_CHAR_PAIRKERNING ).GetValue() ? FontKerning::FontSpecific : FontKerning::NONE ); diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx index 25d7ecc0aa8a..050eed8667f4 100644 --- a/editeng/source/editeng/impedit4.cxx +++ b/editeng/source/editeng/impedit4.cxx @@ -69,6 +69,7 @@ #include <unotools/textsearch.hxx> #include <comphelper/processfactory.hxx> #include <vcl/help.hxx> +#include <vcl/metric.hxx> #include <svtools/rtfkeywd.hxx> #include <editeng/edtdlg.hxx> @@ -928,14 +929,23 @@ void ImpEditEngine::WriteItemAsRTF( const SfxPoolItem& rItem, SvStream& rOutput, sal_uInt16 const nProp = static_cast<const SvxEscapementItem&>(rItem).GetProportionalHeight(); sal_uInt16 nProp100 = nProp*100; // For SWG-Token Prop in 100th percent. short nEsc = static_cast<const SvxEscapementItem&>(rItem).GetEsc(); + const FontMetric& rFontMetric = GetRefDevice()->GetFontMetric(); + double fFontHeight = rFontMetric.GetAscent() + rFontMetric.GetDescent(); + double fAutoAscent = .8; + double fAutoDescent = .2; + if ( fFontHeight ) + { + fAutoAscent = rFontMetric.GetAscent() / fFontHeight; + fAutoDescent = rFontMetric.GetDescent() / fFontHeight; + } if ( nEsc == DFLT_ESC_AUTO_SUPER ) { - nEsc = .8 * (100 - nProp); + nEsc = fAutoAscent * (100 - nProp); nProp100++; // A 1 afterwards means 'automatic'. } else if ( nEsc == DFLT_ESC_AUTO_SUB ) { - nEsc = .2 * -(100 - nProp); + nEsc = fAutoDescent * -(100 - nProp); nProp100++; } // SWG: diff --git a/editeng/source/items/svxfont.cxx b/editeng/source/items/svxfont.cxx index a8792df4c729..f6ff6cf92681 100644 --- a/editeng/source/items/svxfont.cxx +++ b/editeng/source/items/svxfont.cxx @@ -17,6 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <vcl/metric.hxx> #include <vcl/outdev.hxx> #include <vcl/print.hxx> #include <tools/debug.hxx> @@ -55,6 +56,36 @@ SvxFont::SvxFont( const SvxFont &rFont ) SetLanguage(rFont.GetLanguage()); } +void SvxFont::SetNonAutoEscapement(short nNewEsc, const OutputDevice* pOutDev) +{ + nEsc = nNewEsc; + if ( abs(nEsc) == DFLT_ESC_AUTO_SUPER ) + { + double fAutoAscent = .8; + double fAutoDescent = .2; + if ( pOutDev ) + { + const FontMetric& rFontMetric = pOutDev->GetFontMetric(); + double fFontHeight = rFontMetric.GetAscent() + rFontMetric.GetDescent(); + if ( fFontHeight ) + { + fAutoAscent = rFontMetric.GetAscent() / fFontHeight; + fAutoDescent = rFontMetric.GetDescent() / fFontHeight; + } + } + + if ( nEsc == DFLT_ESC_AUTO_SUPER ) + nEsc = fAutoAscent * (100 - nPropr); + else //DFLT_ESC_AUTO_SUB + nEsc = fAutoDescent * -(100 - nPropr); + } + + if ( nEsc > MAX_ESC_POS ) + nEsc = MAX_ESC_POS; + else if ( nEsc < -MAX_ESC_POS ) + nEsc = -MAX_ESC_POS; +} + void SvxFont::DrawArrow( OutputDevice &rOut, const tools::Rectangle& rRect, const Size& rSize, const Color& rCol, bool bLeft ) { diff --git a/include/editeng/svxfont.hxx b/include/editeng/svxfont.hxx index b584bb842b4d..1a33e73189f2 100644 --- a/include/editeng/svxfont.hxx +++ b/include/editeng/svxfont.hxx @@ -49,6 +49,8 @@ public: // Methods for Superscript/Subscript short GetEscapement() const { return nEsc; } void SetEscapement( const short nNewEsc ) { nEsc = nNewEsc; } + // set specific values instead of automatic, and ensure valid value. Depends on nPropr being set already. + void SetNonAutoEscapement(short nNewEsc, const OutputDevice* pOutDev = nullptr); sal_uInt8 GetPropr() const { return nPropr; } void SetPropr( const sal_uInt8 nNewPropr ) { nPropr = nNewPropr; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits