summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-08-15 17:24:28 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-08-26 00:36:58 +0200
commit100fe8a3a1724f1a5f834da11e17d1641be20994 (patch)
tree2eabb9bb131e6f099d815bd7e9069c207f658603
parent33c6dcfaab35a70f8794a67d31fbec636cb485d5 (diff)
automatically set TextRenderModeForResolutionIndependentLayout if we scale
Always render glyphs with a mode suitable for rendering of resolution-independent layout positions if we scale the text positions. The idea being to typically continue to use the system defaults for font settings for UI elements, but where we are rendering into application canvases where there's a mapmode set then automatically use a good mode to render that. Change-Id: I0e5857e377da72ae1a2ede1d88d6408819fc9200 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138324 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--drawinglayer/source/processor2d/vclpixelprocessor2d.cxx9
-rw-r--r--include/vcl/outdev.hxx7
-rw-r--r--include/vcl/vcllayout.hxx5
-rw-r--r--starmath/source/ElementsDockingWindow.cxx1
-rw-r--r--sw/source/core/txtnode/fntcache.cxx6
-rw-r--r--vcl/inc/salgdi.hxx11
-rw-r--r--vcl/qa/cppunit/pdfexport/pdfexport.cxx20
-rw-r--r--vcl/qt5/QtGraphics_Text.cxx3
-rw-r--r--vcl/quartz/salgdi.cxx2
-rw-r--r--vcl/skia/win/gdiimpl.cxx2
-rw-r--r--vcl/skia/x11/textrender.cxx2
-rw-r--r--vcl/source/filter/svm/SvmConverter.cxx1
-rw-r--r--vcl/source/gdi/pdfwriter_impl.cxx10
-rw-r--r--vcl/source/gdi/salgdilayout.cxx3
-rw-r--r--vcl/source/gdi/virdev.cxx2
-rw-r--r--vcl/source/outdev/map.cxx20
-rw-r--r--vcl/source/outdev/outdev.cxx15
-rw-r--r--vcl/source/outdev/text.cxx31
-rw-r--r--vcl/unx/generic/gdi/cairotextrender.cxx2
-rw-r--r--vcl/win/gdi/winlayout.cxx2
20 files changed, 54 insertions, 100 deletions
diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
index fe2f30cbf23a..5e0612f94a93 100644
--- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
@@ -75,12 +75,9 @@ namespace drawinglayer::processor2d
struct VclPixelProcessor2D::Impl
{
AntialiasingFlags m_nOrigAntiAliasing;
- bool m_bOrigTextRenderModeForResolutionIndependentLayout;
explicit Impl(OutputDevice const& rOutDev)
: m_nOrigAntiAliasing(rOutDev.GetAntialiasing())
- , m_bOrigTextRenderModeForResolutionIndependentLayout(
- rOutDev.GetTextRenderModeForResolutionIndependentLayout())
{
}
};
@@ -107,9 +104,6 @@ VclPixelProcessor2D::VclPixelProcessor2D(const geometry::ViewInformation2D& rVie
{
mpOutputDevice->SetAntialiasing(m_pImpl->m_nOrigAntiAliasing & ~AntialiasingFlags::Enable);
}
-
- // tdf#150462 set text render mode to suit use of resolution independent text layout
- mpOutputDevice->SetTextRenderModeForResolutionIndependentLayout(true);
}
VclPixelProcessor2D::~VclPixelProcessor2D()
@@ -119,9 +113,6 @@ VclPixelProcessor2D::~VclPixelProcessor2D()
// restore AntiAliasing
mpOutputDevice->SetAntialiasing(m_pImpl->m_nOrigAntiAliasing);
-
- mpOutputDevice->SetTextRenderModeForResolutionIndependentLayout(
- m_pImpl->m_bOrigTextRenderModeForResolutionIndependentLayout);
}
void VclPixelProcessor2D::tryDrawPolyPolygonColorPrimitive2DDirect(
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 5a13c640a296..27e7650e8f72 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -236,7 +236,6 @@ private:
Point maRefPoint;
AntialiasingFlags mnAntialiasing;
LanguageType meTextLanguage;
- bool mbTextRenderModeForResolutionIndependentLayout;
mutable bool mbMap : 1;
mutable bool mbClipRegion : 1;
@@ -484,10 +483,6 @@ public:
void SetAntialiasing( AntialiasingFlags nMode );
AntialiasingFlags GetAntialiasing() const { return mnAntialiasing; }
- // Render glyphs with a mode suitable for rendering of resolution-independent layout positions.
- void SetTextRenderModeForResolutionIndependentLayout(bool bMode);
- bool GetTextRenderModeForResolutionIndependentLayout() const { return mbTextRenderModeForResolutionIndependentLayout; }
-
void SetDrawMode( DrawModeFlags nDrawMode );
DrawModeFlags GetDrawMode() const { return mnDrawMode; }
@@ -1715,7 +1710,7 @@ public:
SAL_DLLPRIVATE tools::Long ImplLogicHeightToDevicePixel( tools::Long nHeight ) const;
SAL_DLLPRIVATE double ImplLogicHeightToDeviceSubPixel(tools::Long nHeight) const;
- SAL_DLLPRIVATE Point SubPixelToLogic(const DevicePoint& rDevicePt) const;
+ SAL_DLLPRIVATE Point SubPixelToLogic(const DevicePoint& rDevicePt, bool bCheck) const;
/** Convert device pixels to a width in logical units.
diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx
index cbadb47ee0ba..e63d365b49c4 100644
--- a/include/vcl/vcllayout.hxx
+++ b/include/vcl/vcllayout.hxx
@@ -87,6 +87,11 @@ public:
mbTextRenderModeForResolutionIndependentLayout = bTextRenderModeForResolutionIndependentLayout;
}
+ bool GetTextRenderModeForResolutionIndependentLayout() const
+ {
+ return mbTextRenderModeForResolutionIndependentLayout;
+ }
+
// methods using string indexing
virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const = 0;
virtual DeviceCoordinate FillDXArray( std::vector<DeviceCoordinate>* pDXArray ) const = 0;
diff --git a/starmath/source/ElementsDockingWindow.cxx b/starmath/source/ElementsDockingWindow.cxx
index 202396dfc282..49eea01ddb2a 100644
--- a/starmath/source/ElementsDockingWindow.cxx
+++ b/starmath/source/ElementsDockingWindow.cxx
@@ -506,7 +506,6 @@ void SmElementsControl::addElement(const OUString& aElementVisual, const OUStrin
{
std::unique_ptr<SmNode> pNode = maParser->ParseExpression(aElementVisual);
VclPtr<VirtualDevice> pDevice(mpIconView->create_virtual_device());
- pDevice->SetTextRenderModeForResolutionIndependentLayout(true);
pDevice->SetMapMode(MapMode(MapUnit::Map100thMM));
pDevice->SetDrawMode(DrawModeFlags::Default);
pDevice->SetLayoutMode(vcl::text::ComplexTextLayoutFlags::Default);
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index 88d9037a3eb1..146122841e7c 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -1182,10 +1182,6 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
else
{
- const bool bOrigTextRenderModeForResolutionIndependentLayout(rInf.GetOut().GetTextRenderModeForResolutionIndependentLayout());
- // set text render mode to suit use of resolution independent text layout
- rInf.GetOut().SetTextRenderModeForResolutionIndependentLayout(true);
-
const OUString* pStr = &rInf.GetText();
OUString aStr;
@@ -1523,8 +1519,6 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
}
}
}
-
- rInf.GetOut().SetTextRenderModeForResolutionIndependentLayout(bOrigTextRenderModeForResolutionIndependentLayout);
}
}
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
index 75938afecece..a050e4588042 100644
--- a/vcl/inc/salgdi.hxx
+++ b/vcl/inc/salgdi.hxx
@@ -96,16 +96,6 @@ public:
return m_bAntiAlias;
}
- void setTextRenderModeForResolutionIndependentLayout(bool bNew)
- {
- m_bTextRenderModeForResolutionIndependentLayout = bNew;
- }
-
- bool getTextRenderModeForResolutionIndependentLayoutEnabled() const
- {
- return m_bTextRenderModeForResolutionIndependentLayout;
- }
-
// public SalGraphics methods, the interface to the independent vcl part
// get device resolution
@@ -654,7 +644,6 @@ private:
protected:
/// flags which hold the SetAntialiasing() value from OutputDevice
bool m_bAntiAlias : 1;
- bool m_bTextRenderModeForResolutionIndependentLayout : 1;
inline tools::Long GetDeviceWidth(const OutputDevice& rOutDev) const;
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
index a6d635d21369..057773c3ddaf 100644
--- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx
+++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
@@ -818,36 +818,36 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf108963)
= pPdfPageObject->getPathSegment(0);
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFSegmentType::Moveto, pSegment->getType());
basegfx::B2DPoint aPoint = pSegment->getPoint();
- CPPUNIT_ASSERT_DOUBLES_EQUAL(245.395, aPoint.getX(), 0.0005);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(244.261, aPoint.getY(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(245.367, aPoint.getX(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(244.232, aPoint.getY(), 0.0005);
CPPUNIT_ASSERT(!pSegment->isClosed());
pSegment = pPdfPageObject->getPathSegment(1);
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFSegmentType::Lineto, pSegment->getType());
aPoint = pSegment->getPoint();
- CPPUNIT_ASSERT_DOUBLES_EQUAL(275.102, aPoint.getX(), 0.0005);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(267.618, aPoint.getY(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(275.074, aPoint.getX(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(267.590, aPoint.getY(), 0.0005);
CPPUNIT_ASSERT(!pSegment->isClosed());
pSegment = pPdfPageObject->getPathSegment(2);
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFSegmentType::Lineto, pSegment->getType());
aPoint = pSegment->getPoint();
- CPPUNIT_ASSERT_DOUBLES_EQUAL(287.518, aPoint.getX(), 0.0005);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(251.829, aPoint.getY(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(287.490, aPoint.getX(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(251.801, aPoint.getY(), 0.0005);
CPPUNIT_ASSERT(!pSegment->isClosed());
pSegment = pPdfPageObject->getPathSegment(3);
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFSegmentType::Lineto, pSegment->getType());
aPoint = pSegment->getPoint();
- CPPUNIT_ASSERT_DOUBLES_EQUAL(257.839, aPoint.getX(), 0.0005);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(228.472, aPoint.getY(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(257.811, aPoint.getX(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(228.443, aPoint.getY(), 0.0005);
CPPUNIT_ASSERT(!pSegment->isClosed());
pSegment = pPdfPageObject->getPathSegment(4);
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFSegmentType::Lineto, pSegment->getType());
aPoint = pSegment->getPoint();
- CPPUNIT_ASSERT_DOUBLES_EQUAL(245.395, aPoint.getX(), 0.0005);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(244.261, aPoint.getY(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(245.367, aPoint.getX(), 0.0005);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(244.232, aPoint.getY(), 0.0005);
CPPUNIT_ASSERT(pSegment->isClosed());
}
}
diff --git a/vcl/qt5/QtGraphics_Text.cxx b/vcl/qt5/QtGraphics_Text.cxx
index 940578c5d8bf..03db69dbed6e 100644
--- a/vcl/qt5/QtGraphics_Text.cxx
+++ b/vcl/qt5/QtGraphics_Text.cxx
@@ -320,7 +320,8 @@ void QtGraphics::DrawTextLayout(const GenericSalLayout& rLayout)
{
const QtFont* pFont = static_cast<const QtFont*>(&rLayout.GetFont());
assert(pFont);
- QRawFont aRawFont(GetRawFont(*pFont, getTextRenderModeForResolutionIndependentLayoutEnabled()));
+ QRawFont aRawFont(
+ GetRawFont(*pFont, rLayout.GetTextRenderModeForResolutionIndependentLayout()));
QVector<quint32> glyphIndexes;
QVector<QPointF> positions;
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 1ce488be9c4d..8634bfa8ff9b 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -382,7 +382,7 @@ bool AquaSalGraphics::AddTempDevFont(vcl::font::PhysicalFontCollection*,
void AquaSalGraphics::DrawTextLayout(const GenericSalLayout& rLayout)
{
- mpBackend->drawTextLayout(rLayout, getTextRenderModeForResolutionIndependentLayoutEnabled());
+ mpBackend->drawTextLayout(rLayout, rLayout.GetTextRenderModeForResolutionIndependentLayout());
}
void AquaGraphicsBackend::drawTextLayout(const GenericSalLayout& rLayout, bool bTextRenderModeForResolutionIndependentLayout)
diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx
index 586b4e1fdd97..27a915db1f93 100644
--- a/vcl/skia/win/gdiimpl.cxx
+++ b/vcl/skia/win/gdiimpl.cxx
@@ -267,7 +267,7 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout)
SkFont font(typeface);
- bool bSubpixelPositioning = mWinParent.getTextRenderModeForResolutionIndependentLayoutEnabled();
+ bool bSubpixelPositioning = rLayout.GetTextRenderModeForResolutionIndependentLayout();
SkFont::Edging ePreferredAliasing
= bSubpixelPositioning ? SkFont::Edging::kSubpixelAntiAlias : fontEdging;
if (bSubpixelPositioning)
diff --git a/vcl/skia/x11/textrender.cxx b/vcl/skia/x11/textrender.cxx
index 9fda8ba6601c..3548dc61683e 100644
--- a/vcl/skia/x11/textrender.cxx
+++ b/vcl/skia/x11/textrender.cxx
@@ -58,7 +58,7 @@ void SkiaTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalGr
if (rFont.NeedsArtificialBold())
font.setEmbolden(true);
- bool bSubpixelPositioning = rGraphics.getTextRenderModeForResolutionIndependentLayoutEnabled();
+ bool bSubpixelPositioning = rLayout.GetTextRenderModeForResolutionIndependentLayout();
SkFont::Edging ePreferredAliasing
= bSubpixelPositioning ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAntiAlias;
if (bSubpixelPositioning)
diff --git a/vcl/source/filter/svm/SvmConverter.cxx b/vcl/source/filter/svm/SvmConverter.cxx
index efc036cc264a..3be4063be853 100644
--- a/vcl/source/filter/svm/SvmConverter.cxx
+++ b/vcl/source/filter/svm/SvmConverter.cxx
@@ -1275,7 +1275,6 @@ bool TestImportSVM(SvStream& rStream)
SvmReader aReader(rStream);
aReader.Read(aGDIMetaFile);
ScopedVclPtrInstance<VirtualDevice> aVDev;
- aVDev->SetTextRenderModeForResolutionIndependentLayout(true);
try
{
aGDIMetaFile.Play(*aVDev);
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 1e8fc7fa5ea9..b1c4e0d6272b 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -5945,7 +5945,7 @@ void PDFWriterImpl::drawVerticalGlyphs(
sal_Int32 nFontHeight )
{
tools::Long nXOffset = 0;
- Point aCurPos(SubPixelToLogic(rGlyphs[0].m_aPos));
+ Point aCurPos(SubPixelToLogic(rGlyphs[0].m_aPos, fAngle == 0.0));
aCurPos += rAlignOffset;
for( size_t i = 0; i < rGlyphs.size(); i++ )
{
@@ -6035,7 +6035,7 @@ void PDFWriterImpl::drawHorizontalGlyphs(
for( size_t nRun = 0; nRun < aRunEnds.size(); nRun++ )
{
// setup text matrix back transformed to current coordinate system
- Point aCurPos(SubPixelToLogic(rGlyphs[nBeginRun].m_aPos));
+ Point aCurPos(SubPixelToLogic(rGlyphs[nBeginRun].m_aPos, fAngle == 0.0));
aCurPos += rAlignOffset;
// the first run can be set with "Td" operator
// subsequent use of that operator would move
@@ -6342,7 +6342,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
// ascent / descent to match the on-screen rendering.
// This is the top left of the text without ascent / descent.
DevicePoint aDrawPosition(rLayout.GetDrawPosition());
- tools::Rectangle aRectangle(SubPixelToLogic(aDrawPosition),
+ tools::Rectangle aRectangle(SubPixelToLogic(aDrawPosition, true),
Size(ImplDevicePixelToLogicWidth(rLayout.GetTextWidth()), 0));
aRectangle.AdjustTop(-aRefDevFontMetric.GetAscent());
// This includes ascent / descent.
@@ -6353,7 +6353,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
{
// Adapt rectangle for rotated text.
tools::Polygon aPolygon(aRectangle);
- aPolygon.Rotate(SubPixelToLogic(aDrawPosition), pFontInstance->mnOrientation);
+ aPolygon.Rotate(SubPixelToLogic(aDrawPosition, true), pFontInstance->mnOrientation);
drawPolygon(aPolygon);
}
else
@@ -6474,7 +6474,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
{
DevicePoint aStartPt = rLayout.GetDrawPosition();
int nWidth = rLayout.GetTextWidth() / rLayout.GetUnitsPerPixel();
- drawTextLine( SubPixelToLogic(aStartPt),
+ drawTextLine( SubPixelToLogic(aStartPt, true),
ImplDevicePixelToLogicWidth( nWidth ),
eStrikeout, eUnderline, eOverline, bUnderlineAbove );
}
diff --git a/vcl/source/gdi/salgdilayout.cxx b/vcl/source/gdi/salgdilayout.cxx
index 003e7f4d4c02..f0cdcc2dd1a7 100644
--- a/vcl/source/gdi/salgdilayout.cxx
+++ b/vcl/source/gdi/salgdilayout.cxx
@@ -55,8 +55,7 @@ SalGraphics::SalGraphics()
: m_nLayout( SalLayoutFlags::NONE ),
m_eLastMirrorMode(MirrorMode::NONE),
m_nLastMirrorTranslation(0),
- m_bAntiAlias(false),
- m_bTextRenderModeForResolutionIndependentLayout(false)
+ m_bAntiAlias(false)
{
// read global RTL settings
if( AllSettings::GetLayoutRTL() )
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index e082e4b21e72..d0687faa76b2 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -383,8 +383,6 @@ bool VirtualDevice::ImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
mpAlphaVDev->SetMapMode( GetMapMode() );
mpAlphaVDev->SetAntialiasing( GetAntialiasing() );
-
- mpAlphaVDev->SetTextRenderModeForResolutionIndependentLayout(GetTextRenderModeForResolutionIndependentLayout());
}
return true;
diff --git a/vcl/source/outdev/map.cxx b/vcl/source/outdev/map.cxx
index a073b1b029bf..96589cad6ff7 100644
--- a/vcl/source/outdev/map.cxx
+++ b/vcl/source/outdev/map.cxx
@@ -275,15 +275,20 @@ static double ImplLogicToSubPixel(tools::Long n, tools::Long nDPI, tools::Long n
{
assert(nDPI > 0);
assert(nMapDenom != 0);
- return static_cast<double>(n) * nMapNum * nDPI / nMapDenom;
+ double nRet = static_cast<double>(n) * nMapNum * nDPI / nMapDenom;
+ return nRet;
}
-static tools::Long ImplSubPixelToLogic(double n, tools::Long nDPI, tools::Long nMapNum,
+static tools::Long ImplSubPixelToLogic(bool bCheck, double n, tools::Long nDPI, tools::Long nMapNum,
tools::Long nMapDenom)
{
assert(nDPI > 0);
assert(nMapNum != 0);
- return std::round(n * nMapDenom / nMapNum / nDPI);
+
+ double nRes = n * nMapDenom / nMapNum / nDPI;
+ tools::Long nRet(std::round(nRes));
+ assert(!bCheck || n == static_cast<double>(nRet) * nMapNum * nDPI / nMapDenom); (void)bCheck;
+ return nRet;
}
static tools::Long ImplPixelToLogic(tools::Long n, tools::Long nDPI, tools::Long nMapNum,
@@ -1173,14 +1178,17 @@ Point OutputDevice::PixelToLogic( const Point& rDevicePt ) const
maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY ) - maMapRes.mnMapOfsY - mnOutOffLogicY );
}
-Point OutputDevice::SubPixelToLogic(const DevicePoint& rDevicePt) const
+Point OutputDevice::SubPixelToLogic(const DevicePoint& rDevicePt, bool bCheck) const
{
if (!mbMap)
+ {
+ assert(floor(rDevicePt.getX() == rDevicePt.getX()) && floor(rDevicePt.getY() == rDevicePt.getY()));
return Point(rDevicePt.getX(), rDevicePt.getY());
+ }
- return Point(ImplSubPixelToLogic(rDevicePt.getX(), mnDPIX,
+ return Point(ImplSubPixelToLogic(bCheck, rDevicePt.getX(), mnDPIX,
maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX) - maMapRes.mnMapOfsX - mnOutOffLogicX,
- ImplSubPixelToLogic(rDevicePt.getY(), mnDPIY,
+ ImplSubPixelToLogic(bCheck, rDevicePt.getY(), mnDPIY,
maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY) - maMapRes.mnMapOfsY - mnOutOffLogicY);
}
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 952d4ac43550..2bb047acc223 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -105,7 +105,6 @@ OutputDevice::OutputDevice(OutDevType eOutDevType) :
meRasterOp = RasterOp::OverPaint;
mnAntialiasing = AntialiasingFlags::NONE;
meTextLanguage = LANGUAGE_SYSTEM; // TODO: get default from configuration?
- mbTextRenderModeForResolutionIndependentLayout = false;
mbLineColor = true;
mbFillColor = true;
mbInitLineColor = true;
@@ -363,20 +362,6 @@ void OutputDevice::SetAntialiasing( AntialiasingFlags nMode )
mpAlphaVDev->SetAntialiasing( nMode );
}
-void OutputDevice::SetTextRenderModeForResolutionIndependentLayout(bool bMode)
-{
- if (mbTextRenderModeForResolutionIndependentLayout!= bMode)
- {
- mbTextRenderModeForResolutionIndependentLayout = bMode;
-
- if (mpGraphics)
- mpGraphics->setTextRenderModeForResolutionIndependentLayout(bMode);
- }
-
- if (mpAlphaVDev)
- mpAlphaVDev->SetTextRenderModeForResolutionIndependentLayout(bMode);
-}
-
void OutputDevice::SetDrawMode(DrawModeFlags nDrawMode)
{
mnDrawMode = nDrawMode;
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 6ca2785e3b1f..0cf0283dc5c7 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -1377,7 +1377,7 @@ std::unique_ptr<SalLayout> OutputDevice::ImplLayout(const OUString& rOrigStr,
vcl::text::ImplLayoutArgs aLayoutArgs = ImplPrepareLayoutArgs( aStr, nMinIndex, nLen,
nPixelWidth, flags, pLayoutCache);
- bool bTextRenderModeForResolutionIndependentLayout(false);
+ bool bHasScaledDXArray(false);
DeviceCoordinate nEndGlyphCoord(0);
std::unique_ptr<double[]> xNaturalDXPixelArray;
if( !pDXArray.empty() )
@@ -1386,23 +1386,11 @@ std::unique_ptr<SalLayout> OutputDevice::ImplLayout(const OUString& rOrigStr,
if (mbMap)
{
- // convert from logical units to font units
- if (GetTextRenderModeForResolutionIndependentLayout())
- {
- // without rounding, keeping accuracy for lower levels
- bTextRenderModeForResolutionIndependentLayout = true;
- for (int i = 0; i < nLen; ++i)
- xNaturalDXPixelArray[i] = ImplLogicWidthToDeviceSubPixel(pDXArray[i]);
-
- }
- else
- {
- // with rounding
- // using base position for better rounding a.k.a. "dancing characters"
- DeviceCoordinate nPixelXOfs2 = LogicWidthToDeviceCoordinate(rLogicalPos.X() * 2);
- for (int i = 0; i < nLen; ++i)
- xNaturalDXPixelArray[i] = (LogicWidthToDeviceCoordinate((rLogicalPos.X() + pDXArray[i]) * 2) - nPixelXOfs2) / 2;
- }
+ // convert from logical units to font units without rounding,
+ // keeping accuracy for lower levels
+ bHasScaledDXArray = true;
+ for (int i = 0; i < nLen; ++i)
+ xNaturalDXPixelArray[i] = ImplLogicWidthToDeviceSubPixel(pDXArray[i]);
}
else
{
@@ -1429,7 +1417,7 @@ std::unique_ptr<SalLayout> OutputDevice::ImplLayout(const OUString& rOrigStr,
if( !pSalLayout )
return nullptr;
- pSalLayout->SetTextRenderModeForResolutionIndependentLayout(bTextRenderModeForResolutionIndependentLayout);
+ pSalLayout->SetTextRenderModeForResolutionIndependentLayout(bHasScaledDXArray);
// do glyph fallback if needed
// #105768# avoid fallback for very small font sizes
@@ -1444,7 +1432,10 @@ std::unique_ptr<SalLayout> OutputDevice::ImplLayout(const OUString& rOrigStr,
// position, justify, etc. the layout
pSalLayout->AdjustLayout( aLayoutArgs );
- if (bTextRenderModeForResolutionIndependentLayout)
+ // default to on for pdf export which uses SubPixelToLogic to convert back to
+ // the logical coord space, default off for everything else for now unless
+ // a dxarray is provided which has to be scaled
+ if (bHasScaledDXArray || meOutDevType == OUTDEV_PDF)
pSalLayout->DrawBase() = ImplLogicToDeviceSubPixel(rLogicalPos);
else
{
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index 24e5580e9bdb..006ea2ce8d4a 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -228,7 +228,7 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG
const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
const bool bDisableAA = !rStyleSettings.GetUseFontAAFromSystem() && !rGraphics.getAntiAlias();
- const bool bResolutionIndependentLayoutEnabled = rGraphics.getTextRenderModeForResolutionIndependentLayoutEnabled();
+ const bool bResolutionIndependentLayoutEnabled = rLayout.GetTextRenderModeForResolutionIndependentLayout();
const cairo_font_options_t* pFontOptions = GetSalInstance()->GetCairoFontOptions();
if (pFontOptions || bDisableAA || bResolutionIndependentLayoutEnabled)
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 8371c9577225..66e9ac3e3597 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -320,7 +320,7 @@ void WinSalGraphics::DrawTextLayout(const GenericSalLayout& rLayout)
// DWrite text renderer performs vertical writing better except printing.
const bool bVerticalScreenText
= !mbPrinter && rLayout.GetFont().GetFontSelectPattern().mbVertical;
- const bool bRenderingModeNatural = getTextRenderModeForResolutionIndependentLayoutEnabled();
+ const bool bRenderingModeNatural = rLayout.GetTextRenderModeForResolutionIndependentLayout();
const bool bUseDWrite = bVerticalScreenText || bRenderingModeNatural;
DrawTextLayout(rLayout, hDC, bUseDWrite, bRenderingModeNatural);