[Libreoffice-commits] core.git: include/vcl vcl/qa vcl/source
Chris Sherlock (via logerrit)
logerrit at kemper.freedesktop.org
Thu Sep 2 00:24:08 UTC 2021
include/vcl/outdev.hxx | 9 +++
include/vcl/print.hxx | 4 +
vcl/qa/cppunit/outdev.cxx | 76 ++++++++++++++++++++++++++++++++
vcl/source/gdi/print.cxx | 19 ++++++++
vcl/source/outdev/textline.cxx | 95 ++++++++++++++++++++++++-----------------
5 files changed, 162 insertions(+), 41 deletions(-)
New commits:
commit 368e21fbc34fa4104f16498a54ab77704f39e6b4
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
AuthorDate: Wed May 12 20:16:24 2021 +1000
Commit: Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Thu Sep 2 02:23:35 2021 +0200
tdf#74702 vcl: make helper funcs for ImplDrawWaveLine() and ImplDrawWavePixel()
Unit tests written for Printer and OutputDevice, note that I might have
uncovered a bug.
Change-Id: Ic8e6e02ce0df349fc6fb6a3334105c1e6dfa3f36
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113563
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 95df09d055bf..e2a4b4d190d1 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -1077,6 +1077,11 @@ protected:
static
SAL_DLLPRIVATE tools::Long ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, tools::Long nWidth, const OUString& rStr, DrawTextFlags nStyle, const vcl::ITextLayout& _rLayout );
SAL_DLLPRIVATE float approximate_char_width() const;
+
+ virtual bool shouldDrawWavePixelAsRect(tools::Long nLineWidth) const;
+ virtual void SetWaveLineColors(Color const& rColor, tools::Long nLineWidth);
+ virtual Size GetWaveLineSize(tools::Long nLineWidth) const;
+
private:
SAL_DLLPRIVATE void ImplInitTextColor();
@@ -1084,8 +1089,8 @@ private:
SAL_DLLPRIVATE void ImplDrawSpecialText( SalLayout& );
SAL_DLLPRIVATE void ImplDrawTextRect( tools::Long nBaseX, tools::Long nBaseY, tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight );
- SAL_DLLPRIVATE static void ImplDrawWavePixel( tools::Long nOriginX, tools::Long nOriginY, tools::Long nCurX, tools::Long nCurY, Degree10 nOrientation, SalGraphics* pGraphics, const OutputDevice& rOutDev,
- bool bDrawPixAsRect, tools::Long nPixWidth, tools::Long nPixHeight );
+ SAL_DLLPRIVATE void ImplDrawWavePixel( tools::Long nOriginX, tools::Long nOriginY, tools::Long nCurX, tools::Long nCurY, tools::Long nWidth, Degree10 nOrientation, SalGraphics* pGraphics, const OutputDevice& rOutDev, tools::Long nPixWidth, tools::Long nPixHeight );
+
SAL_DLLPRIVATE void ImplDrawWaveLine( tools::Long nBaseX, tools::Long nBaseY, tools::Long nStartX, tools::Long nStartY, tools::Long nWidth, tools::Long nHeight, tools::Long nLineWidth, Degree10 nOrientation, const Color& rColor );
SAL_DLLPRIVATE void ImplDrawWaveTextLine( tools::Long nBaseX, tools::Long nBaseY, tools::Long nX, tools::Long nY, tools::Long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove );
SAL_DLLPRIVATE void ImplDrawStraightTextLine( tools::Long nBaseX, tools::Long nBaseY, tools::Long nX, tools::Long nY, tools::Long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove );
diff --git a/include/vcl/print.hxx b/include/vcl/print.hxx
index 1ffce121bba1..b4db13959954 100644
--- a/include/vcl/print.hxx
+++ b/include/vcl/print.hxx
@@ -248,6 +248,10 @@ protected:
virtual void SetFontOrientation( LogicalFontInstance* const pFontInstance ) const override;
+ bool shouldDrawWavePixelAsRect(tools::Long) const override { return true; }
+ void SetWaveLineColors(Color const& rColor, tools::Long) override;
+ Size GetWaveLineSize(tools::Long nLineWidth) const override;
+
public:
Printer();
Printer( const JobSetup& rJobSetup );
diff --git a/vcl/qa/cppunit/outdev.cxx b/vcl/qa/cppunit/outdev.cxx
index bc70ba11ac25..d9aa34a0250c 100644
--- a/vcl/qa/cppunit/outdev.cxx
+++ b/vcl/qa/cppunit/outdev.cxx
@@ -49,6 +49,8 @@ public:
void testTransparentFillColor();
void testFillColor();
void testSystemTextColor();
+ void testShouldDrawWavePixelAsRect();
+ void testGetWaveLineSize();
CPPUNIT_TEST_SUITE(VclOutdevTest);
CPPUNIT_TEST(testVirtualDevice);
@@ -71,6 +73,8 @@ public:
CPPUNIT_TEST(testTransparentFillColor);
CPPUNIT_TEST(testFillColor);
CPPUNIT_TEST(testSystemTextColor);
+ CPPUNIT_TEST(testShouldDrawWavePixelAsRect);
+ CPPUNIT_TEST(testGetWaveLineSize);
CPPUNIT_TEST_SUITE_END();
};
@@ -549,6 +553,78 @@ void VclOutdevTest::testSystemTextColor()
}
}
+namespace
+{
+class WaveLineTester : public OutputDevice
+{
+public:
+ WaveLineTester()
+ : OutputDevice(OUTDEV_VIRDEV)
+ {
+ }
+
+ bool AcquireGraphics() const { return true; }
+ void ReleaseGraphics(bool) {}
+ bool UsePolyPolygonForComplexGradient() { return false; }
+
+ bool testShouldDrawWavePixelAsRect(tools::Long nLineWidth)
+ {
+ return shouldDrawWavePixelAsRect(nLineWidth);
+ }
+
+ Size testGetWaveLineSize(tools::Long nLineWidth) { return GetWaveLineSize(nLineWidth); }
+};
+
+class WaveLineTesterPrinter : public Printer
+{
+public:
+ WaveLineTesterPrinter() {}
+
+ bool AcquireGraphics() const { return true; }
+ void ReleaseGraphics(bool) {}
+ bool UsePolyPolygonForComplexGradient() { return false; }
+
+ Size testGetWaveLineSize(tools::Long nLineWidth) { return GetWaveLineSize(nLineWidth); }
+};
+}
+
+void VclOutdevTest::testShouldDrawWavePixelAsRect()
+{
+ ScopedVclPtrInstance<WaveLineTester> pTestOutDev;
+
+ CPPUNIT_ASSERT(!pTestOutDev->testShouldDrawWavePixelAsRect(0));
+ CPPUNIT_ASSERT(!pTestOutDev->testShouldDrawWavePixelAsRect(1));
+
+ CPPUNIT_ASSERT(pTestOutDev->testShouldDrawWavePixelAsRect(10));
+}
+
+void VclOutdevTest::testGetWaveLineSize()
+{
+ {
+ ScopedVclPtrInstance<WaveLineTester> pTestOutDev;
+
+ pTestOutDev->SetDPIX(96);
+ pTestOutDev->SetDPIY(96);
+
+ CPPUNIT_ASSERT_EQUAL(Size(1, 1), pTestOutDev->testGetWaveLineSize(0));
+ CPPUNIT_ASSERT_EQUAL(Size(1, 1), pTestOutDev->testGetWaveLineSize(1));
+
+ CPPUNIT_ASSERT_EQUAL(Size(10, 10), pTestOutDev->testGetWaveLineSize(10));
+ }
+
+ {
+ ScopedVclPtrInstance<WaveLineTesterPrinter> pTestOutDev;
+
+ pTestOutDev->SetDPIX(96);
+ pTestOutDev->SetDPIY(96);
+
+ CPPUNIT_ASSERT_EQUAL(Size(0, 0), pTestOutDev->testGetWaveLineSize(0));
+ CPPUNIT_ASSERT_EQUAL(Size(1, 1), pTestOutDev->testGetWaveLineSize(1));
+
+ CPPUNIT_ASSERT_EQUAL(Size(10, 10), pTestOutDev->testGetWaveLineSize(10));
+ }
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(VclOutdevTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx
index 593744b4e321..6b6b070a69f3 100644
--- a/vcl/source/gdi/print.cxx
+++ b/vcl/source/gdi/print.cxx
@@ -1750,6 +1750,25 @@ css::awt::DeviceInfo Printer::GetDeviceInfo() const
return aInfo;
}
+void Printer::SetWaveLineColors(Color const& rColor, tools::Long)
+{
+ if (mbLineColor || mbInitLineColor)
+ {
+ mpGraphics->SetLineColor();
+ mbInitLineColor = true;
+ }
+
+ mpGraphics->SetFillColor(rColor);
+ mbInitFillColor = true;
+}
+
+Size Printer::GetWaveLineSize(tools::Long nLineWidth) const
+{
+ // FIXME - do we have a bug here? If the linewidth is 0, then we will return
+ // Size(0, 0) - is this correct?
+ return Size(nLineWidth, ((nLineWidth*mnDPIX)+(mnDPIY/2))/mnDPIY);
+}
+
void Printer::SetSystemTextColor(SystemTextColorFlags, bool)
{
SetTextColor(COL_BLACK);
diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx
index 2ce85be775ad..9fd82541262f 100644
--- a/vcl/source/outdev/textline.cxx
+++ b/vcl/source/outdev/textline.cxx
@@ -113,21 +113,20 @@ void OutputDevice::ImplInitAboveTextLineSize()
void OutputDevice::ImplDrawWavePixel( tools::Long nOriginX, tools::Long nOriginY,
tools::Long nCurX, tools::Long nCurY,
+ tools::Long nWidth,
Degree10 nOrientation,
SalGraphics* pGraphics,
const OutputDevice& rOutDev,
- bool bDrawPixAsRect,
tools::Long nPixWidth, tools::Long nPixHeight )
{
- if ( nOrientation )
+ if (nOrientation)
{
Point aPoint( nOriginX, nOriginY );
aPoint.RotateAround( nCurX, nCurY, nOrientation );
}
- if ( bDrawPixAsRect )
+ if (shouldDrawWavePixelAsRect(nWidth))
{
-
pGraphics->DrawRect( nCurX, nCurY, nPixWidth, nPixHeight, rOutDev );
}
else
@@ -136,6 +135,43 @@ void OutputDevice::ImplDrawWavePixel( tools::Long nOriginX, tools::Long nOriginY
}
}
+bool OutputDevice::shouldDrawWavePixelAsRect(tools::Long nLineWidth) const
+{
+ if (nLineWidth > 1)
+ return true;
+
+ return false;
+}
+
+void OutputDevice::SetWaveLineColors(Color const& rColor, tools::Long nLineWidth)
+{
+ // On printers that output pixel via DrawRect()
+ if (nLineWidth > 1)
+ {
+ if (mbLineColor || mbInitLineColor)
+ {
+ mpGraphics->SetLineColor();
+ mbInitLineColor = true;
+ }
+
+ mpGraphics->SetFillColor( rColor );
+ mbInitFillColor = true;
+ }
+ else
+ {
+ mpGraphics->SetLineColor( rColor );
+ mbInitLineColor = true;
+ }
+}
+
+Size OutputDevice::GetWaveLineSize(tools::Long nLineWidth) const
+{
+ if (nLineWidth > 1)
+ return Size(nLineWidth, ((nLineWidth*mnDPIX)+(mnDPIY/2))/mnDPIY);
+
+ return Size(1, 1);
+}
+
void OutputDevice::ImplDrawWaveLine( tools::Long nBaseX, tools::Long nBaseY,
tools::Long nDistX, tools::Long nDistY,
tools::Long nWidth, tools::Long nHeight,
@@ -172,39 +208,20 @@ void OutputDevice::ImplDrawWaveLine( tools::Long nBaseX, tools::Long nBaseY,
tools::Long nDiffY = nHeight-1;
tools::Long nCount = nWidth;
tools::Long nOffY = -1;
- tools::Long nPixWidth;
- tools::Long nPixHeight;
- bool bDrawPixAsRect;
- // On printers that output pixel via DrawRect()
- if ( (GetOutDevType() == OUTDEV_PRINTER) || (nLineWidth > 1) )
- {
- if ( mbLineColor || mbInitLineColor )
- {
- mpGraphics->SetLineColor();
- mbInitLineColor = true;
- }
- mpGraphics->SetFillColor( rColor );
- mbInitFillColor = true;
- bDrawPixAsRect = true;
- nPixWidth = nLineWidth;
- nPixHeight = ((nLineWidth*mnDPIX)+(mnDPIY/2))/mnDPIY;
- }
- else
- {
- mpGraphics->SetLineColor( rColor );
- mbInitLineColor = true;
- nPixWidth = 1;
- nPixHeight = 1;
- bDrawPixAsRect = false;
- }
+
+ SetWaveLineColors(rColor, nLineWidth);
+ Size aSize(GetWaveLineSize(nLineWidth));
+
+ tools::Long nPixWidth = aSize.Width();
+ tools::Long nPixHeight = aSize.Height();
if ( !nDiffY )
{
while ( nWidth )
{
- ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nOrientation,
+ ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nLineWidth, nOrientation,
mpGraphics, *this,
- bDrawPixAsRect, nPixWidth, nPixHeight );
+ nPixWidth, nPixHeight );
nCurX++;
nWidth--;
}
@@ -217,17 +234,17 @@ void OutputDevice::ImplDrawWaveLine( tools::Long nBaseX, tools::Long nBaseY,
{
for( tools::Long i = nDiffY; i; --i )
{
- ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nOrientation,
+ ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nLineWidth, nOrientation,
mpGraphics, *this,
- bDrawPixAsRect, nPixWidth, nPixHeight );
+ nPixWidth, nPixHeight );
nCurX++;
nCurY += nOffY;
}
for( tools::Long i = nDiffX; i; --i )
{
- ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nOrientation,
+ ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nLineWidth, nOrientation,
mpGraphics, *this,
- bDrawPixAsRect, nPixWidth, nPixHeight );
+ nPixWidth, nPixHeight );
nCurX++;
}
nOffY = -nOffY;
@@ -237,18 +254,18 @@ void OutputDevice::ImplDrawWaveLine( tools::Long nBaseX, tools::Long nBaseY,
{
for( tools::Long i = nDiffY; i && nFreq; --i, --nFreq )
{
- ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nOrientation,
+ ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nLineWidth, nOrientation,
mpGraphics, *this,
- bDrawPixAsRect, nPixWidth, nPixHeight );
+ nPixWidth, nPixHeight );
nCurX++;
nCurY += nOffY;
}
for( tools::Long i = nDiffX; i && nFreq; --i, --nFreq )
{
- ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nOrientation,
+ ImplDrawWavePixel( nBaseX, nBaseY, nCurX, nCurY, nLineWidth, nOrientation,
mpGraphics, *this,
- bDrawPixAsRect, nPixWidth, nPixHeight );
+ nPixWidth, nPixHeight );
nCurX++;
}
}
More information about the Libreoffice-commits
mailing list