diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 75a064f..3e89c99 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -17,6 +17,8 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include + #include #include @@ -59,6 +61,9 @@ #include #include +#include + + bool SwFlowFrame::m_bMoveBwdJump = false; SwFlowFrame::SwFlowFrame( SwFrame &rFrame ) : @@ -1526,6 +1531,56 @@ SwTwips SwFlowFrame::CalcUpperSpace( const SwBorderAttrs *pAttrs, { nUpper += GetUpperSpaceAmountConsideredForPageGrid_( nUpper ); } + + if (pPrevFrame && pPrevFrame->IsTextFrame()) { + std::cout << "We' got previous frame!" << std::endl; + const SwTextFrame *pTextFrame = static_cast< const SwTextFrame * >( pPrevFrame ); + if (pTextFrame) { + std::cout << "We' got text frame!!" << std::endl; + if (pTextFrame->GetTextNode()) { + std::cout << "We' got text node!" << std::endl; + if(pTextFrame->GetTextNode()->HasBullet()) { + std::cout << "We' got bullet!" << std::endl; + /*int rFontHeight; + int rDropHeight; + int rDropDescent; + if(pTextFrame->GetTextNode()->GetDropSize (rFontHeight, rDropHeight, rDropDescent)) { + std::cout << "We' got rFontHeight: " << rFontHeight << std::endl; + std::cout << "We' got rDropHeight: " << rDropHeight << std::endl; + std::cout << "We' got rDropDescent: " << rDropDescent << std::endl; + } + + SwTextFormatColl *formatcoll = pTextFrame->GetTextNode()->GetTextColl(); + if (formatcoll) { + std::cout << "We' got formatcoll!" << std::endl; + const SvxFontHeightItem size = formatcoll->GetSize(); + std::cout << "Height is: " << size.GetHeight() << std::endl; + }*/ + + SwTwips lineSpacing = 0; + const SwFrame* pPrevFrame = GetPrevFrameForUpperSpaceCalc_(); + if ( pPrevFrame ) + { + SwTwips nPrevLowerSpace = 0; + SwTwips nPrevLineSpacing = 0; + // #i102458# + bool bDummy = false; + GetSpacingValuesOfFrame( (*pPrevFrame), nPrevLowerSpace, nPrevLineSpacing, bDummy ); + std::cout << "We' got spacing: " << nPrevLowerSpace << ", " + << nPrevLineSpacing << std::endl; + lineSpacing = nPrevLineSpacing; + } + + + + +// nUpper += 20; + nUpper += 0.20*lineSpacing; + } + } + } + } + return nUpper; } diff --git a/vcl/source/font/fontmetric.cxx b/vcl/source/font/fontmetric.cxx index 4ef24c8..305e15c 100644 --- a/vcl/source/font/fontmetric.cxx +++ b/vcl/source/font/fontmetric.cxx @@ -32,6 +32,7 @@ #include +#include #include #include #include @@ -41,6 +42,8 @@ using namespace ::com::sun::star::uno; using namespace ::rtl; using namespace ::utl; +bool ShouldUseMaxLineGap(vcl::TTGlobalFontInfo& rInfo, OUString aFontIdentifier); + FontMetric::FontMetric() : mxImplMetric( new ImplFontMetric() ) {} @@ -82,42 +85,114 @@ bool FontMetric::operator==( const FontMetric& rFontMetric ) const long FontMetric::GetAscent() const { + /*OUString aFontIdentifier( + GetFamilyName() + "," + + OUString::number(rInfo.ascender) + "," + OUString::number(rInfo.descender) + "," + + OUString::number(rInfo.typoAscender) + "," + OUString::number(rInfo.typoDescender) + "," + + OUString::number(rInfo.winAscent) + "," + OUString::number(rInfo.winDescent)); + */ + + long mnAscent = mxImplMetric->GetAscent(); + long mnDescent = mxImplMetric->GetDescent(); + long mnExtLeading = GetExternalLeading(); + + if (mnAscent == 1825 && mnDescent == 443 && mnExtLeading == 87) + { + std::cout << "GetAscent called for our font!" << std::endl; + } return mxImplMetric->GetAscent(); } void FontMetric::SetAscent( long nAscent ) { + std::cout << "SetAscent called" << std::endl; + std::cout << "Before: " << mxImplMetric->GetAscent() << std::endl; mxImplMetric->SetAscent( nAscent ); + std::cout << "After: " << mxImplMetric->GetAscent() << std::endl; } long FontMetric::GetDescent() const { + /*OUString aFontIdentifier( + GetFamilyName() + "," + + OUString::number(rInfo.ascender) + "," + OUString::number(rInfo.descender) + "," + + OUString::number(rInfo.typoAscender) + "," + OUString::number(rInfo.typoDescender) + "," + + OUString::number(rInfo.winAscent) + "," + OUString::number(rInfo.winDescent)); + */ + + long mnAscent = mxImplMetric->GetAscent(); + long mnDescent = mxImplMetric->GetDescent(); + long mnExtLeading = mxImplMetric->GetExternalLeading(); + + if (mnAscent == 1825 && mnDescent == 443 && mnExtLeading == 87) + { + std::cout << "GetDescent called for our font!" << std::endl; + } return mxImplMetric->GetDescent(); } void FontMetric::SetDescent( long nDescent ) { + std::cout << "SetDescent called" << std::endl; + std::cout << "Before: " << mxImplMetric->GetDescent() << std::endl; mxImplMetric->SetDescent( nDescent ); + std::cout << "After: " << mxImplMetric->GetDescent() << std::endl; } long FontMetric::GetInternalLeading() const { + /*OUString aFontIdentifier( + GetFamilyName() + "," + + OUString::number(rInfo.ascender) + "," + OUString::number(rInfo.descender) + "," + + OUString::number(rInfo.typoAscender) + "," + OUString::number(rInfo.typoDescender) + "," + + OUString::number(rInfo.winAscent) + "," + OUString::number(rInfo.winDescent)); + */ + + long mnAscent = mxImplMetric->GetAscent(); + long mnDescent = mxImplMetric->GetDescent(); + long mnExtLeading = mxImplMetric->GetExternalLeading(); + + if (mnAscent == 1825 && mnDescent == 443 && mnExtLeading == 87) + { + std::cout << "GetInternalLeading called for our font!" << std::endl; + } return mxImplMetric->GetInternalLeading(); } void FontMetric::SetInternalLeading( long nLeading ) { - mxImplMetric->SetInternalLeading( nLeading ); + std::cout << "SetInternalLeading called" << std::endl; + std::cout << "Before: " << mxImplMetric->GetInternalLeading() << std::endl; + mxImplMetric->SetInternalLeading( /*nLeading > 0 ? -nLeading :*/ nLeading ); + std::cout << "After: " << mxImplMetric->GetInternalLeading() << std::endl; } long FontMetric::GetExternalLeading() const -{ +{ + /*OUString aFontIdentifier( + GetFamilyName() + "," + + OUString::number(rInfo.ascender) + "," + OUString::number(rInfo.descender) + "," + + OUString::number(rInfo.typoAscender) + "," + OUString::number(rInfo.typoDescender) + "," + + OUString::number(rInfo.winAscent) + "," + OUString::number(rInfo.winDescent));*/ + + long mnAscent = mxImplMetric->GetAscent(); + long mnDescent = mxImplMetric->GetDescent(); + long mnExtLeading = mxImplMetric->GetExternalLeading(); + + /*if (mnAscent == 1825 && mnDescent == 443 && mnExtLeading == 87) + {*/ + std::cout << "GetExternalLeading called" << std::endl; + std::cout << mnAscent << ", " << mnDescent << ", " << mnExtLeading << std::endl; + //} return mxImplMetric->GetExternalLeading(); } void FontMetric::SetExternalLeading( long nLeading ) { - mxImplMetric->SetExternalLeading( nLeading ); + std::cout << "SetExternalLeading called" << std::endl; + //std::cout << "Before: " << mxImplMetric->GetExternalLeading() << std::endl; + mxImplMetric->SetExternalLeading( nLeading); + //std::cout << "After: " << mxImplMetric->GetExternalLeading() << std::endl; } long FontMetric::GetLineHeight() const @@ -413,6 +488,9 @@ bool ImplFontMetricData::ShouldUseWinMetrics(vcl::TTGlobalFontInfo& rInfo) + OUString::number(rInfo.typoAscender) + "," + OUString::number(rInfo.typoDescender) + "," + OUString::number(rInfo.winAscent) + "," + OUString::number(rInfo.winDescent)); + std::cout << aFontIdentifier << std::endl; + + css::uno::Sequence rWinMetricFontList( officecfg::Office::Common::Misc::FontsUseWinMetrics::get()); for (int i = 0; i < rWinMetricFontList.getLength(); ++i) @@ -426,6 +504,33 @@ bool ImplFontMetricData::ShouldUseWinMetrics(vcl::TTGlobalFontInfo& rInfo) return false; } +bool ShouldUseMaxLineGap(vcl::TTGlobalFontInfo& rInfo, OUString aFontIdentifier) +{ + if (aFontIdentifier == "Times New Roman,1825,-443,1420,-442,1825,443") { + std::cout << "We have it!" << std::endl; + return true; + } + return false; +} + +bool ShouldUseOS_2Metrics(vcl::TTGlobalFontInfo& rInfo, OUString aFontIdentifier) +{ + if (aFontIdentifier == "Times New Roman,1825,-443,1420,-442,1825,443") { + std::cout << "We have it!" << std::endl; + return true; + } + return false; +} + +bool ShouldUseHHEAMetrics(vcl::TTGlobalFontInfo& rInfo, OUString aFontIdentifier) +{ + if (aFontIdentifier == "Times New Roman,1825,-443,1420,-442,1825,443") { + std::cout << "We have it!" << std::endl; + return true; + } + return false; +} + /* * Calculate line spacing: * @@ -468,7 +573,7 @@ void ImplFontMetricData::ImplCalcLineSpacing(const std::vector& rHheaDa if (rInfo.winAscent || rInfo.winDescent || rInfo.typoAscender || rInfo.typoDescender) { - if (ShouldUseWinMetrics(rInfo) || (fAscent == 0.0 && fDescent == 0.0)) + if (fAscent == 0.0 && fDescent == 0.0) { fAscent = rInfo.winAscent * fScale; fDescent = rInfo.winDescent * fScale; @@ -485,10 +590,85 @@ void ImplFontMetricData::ImplCalcLineSpacing(const std::vector& rHheaDa } } +/* OUString aFontIdentifier( + GetFamilyName() + "," + + OUString::number(rInfo.ascender) + "," + + OUString::number(rInfo.descender) + "," + + OUString::number(rInfo.linegap) + "," + + OUString::number(rInfo.typoAscender)+ "," + + OUString::number(rInfo.typoDescender) + "," + + OUString::number(rInfo.typoLineGap) + "," + + OUString::number(rInfo.winAscent) + "," + + OUString::number(rInfo.winDescent)); + std::cout << "Font info: " << aFontIdentifier << std::endl;*/ + + OUString aFontIdentifier( + GetFamilyName() + "," + + OUString::number(rInfo.ascender) + "," + OUString::number(rInfo.descender) + "," + + OUString::number(rInfo.typoAscender) + "," + OUString::number(rInfo.typoDescender) + "," + + OUString::number(rInfo.winAscent) + "," + OUString::number(rInfo.winDescent)); + + + /*if (ShouldUseWinMetrics(rInfo)) + { + fAscent = rInfo.winAscent * fScale; + fDescent = rInfo.winDescent * fScale; + fExtLeading = 0; + }*/ + + /*if (ShouldUseOS_2Metrics(rInfo, aFontIdentifier)) + { + //std::cout << "will use OS_2 metrics for " << aFontIdentifier << std::endl; + fAscent = rInfo.typoAscender * fScale; + fDescent = -rInfo.typoDescender * fScale; + fExtLeading = rInfo.typoLineGap * fScale; + }*/ + + /*if (ShouldUseHHEAMetrics(rInfo, aFontIdentifier)) + { + std::cout << "will use hhea metrics for " << aFontIdentifier << std::endl; + fAscent = rInfo.ascender * fScale; + fDescent = -rInfo.descender * fScale; + fExtLeading = rInfo.linegap * fScale; + }*/ + + if (0/*ShouldUseMaxLineGap(rInfo, aFontIdentifier)*/) + { + //fAscent = rInfo.ascender * (fScale + 0.012); + fAscent = rInfo.ascender * fScale; + fDescent = -rInfo.descender * fScale; + //fExtLeading = rInfo.linegap * (fScale + 0.000125); + fExtLeading = rInfo.linegap * fScale; + /*if (rInfo.linegap > rInfo.typoLineGap) + fExtLeading = rInfo.linegap * fScale; + else + fExtLeading = rInfo.typoLineGap * fScale;*/ +// fAscent = 1856 * fScale; + fAscent = 1839 * fScale; +// fDescent = 475 * fScale; + fDescent = 443 * fScale; +// fExtLeading = 115 * fScale; + fExtLeading = 88 * fScale; + } + + + // Take a look at Format > Paragraph > Indents & Spacing > Spacing > Above/Below + // maybe that is the right place to fix this problem. + + // Take a look at ba18832ceeda21f047a664b71a4333a54737e6c8 + mnAscent = round(fAscent); mnDescent = round(fDescent); mnExtLeading = round(fExtLeading); + if (ShouldUseMaxLineGap(rInfo, aFontIdentifier)) + { + std::cout << fAscent/fScale << ", " << fDescent/fScale << ", " << fExtLeading/fScale << std::endl; + std::cout << fAscent << ", " << fDescent << ", " << fExtLeading << std::endl; + std::cout << mnAscent << ", " << mnDescent << ", " << mnExtLeading << std::endl; + std::cout << "Units per em is: " << nUPEM << std::endl; + } + if (mnAscent || mnDescent) mnIntLeading = mnAscent + mnDescent - mnHeight;