From c900069dee03c5ebf631a5862b94cd2962cbaea0 Mon Sep 17 00:00:00 2001 From: Cédric Bosdonnat Date: Tue, 13 Sep 2011 10:01:44 +0200 Subject: Header/Footer: display improvements Changed the following: + Draw a gradient in the separator tabs background + Draw a solid line under the dotted one to have a contrast for some page background colors. --- sw/source/core/layout/paintfrm.cxx | 31 ++++++++++++++++++++++++------- sw/source/ui/docvw/HeaderFooterWin.cxx | 24 ++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 38247ed0aaec..eee5966ea889 100755 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -3279,31 +3279,48 @@ drawinglayer::primitive2d::Primitive2DSequence lcl_CreateHeaderFooterSeparatorPr const SwPageFrm* pPageFrm, double nLineY ) { // Adjust the Y-coordinate of the line to the header/footer box - drawinglayer::primitive2d::Primitive2DSequence aSeq( 1 ); + drawinglayer::primitive2d::Primitive2DSequence aSeq( 2 ); basegfx::B2DPoint aLeft ( pPageFrm->Frm().Left(), nLineY ); basegfx::B2DPoint aRight( pPageFrm->Frm().Right(), nLineY ); basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor(); + // Get a color for the contrast + basegfx::BColor aHslLine = basegfx::tools::rgb2hsl( aLineColor ); + double nLuminance = aHslLine.getZ() * 2.5; + if ( nLuminance == 0 ) + nLuminance = 0.5; + else if ( nLuminance >= 1.0 ) + nLuminance = aHslLine.getZ() * 0.4; + aHslLine.setZ( nLuminance ); + const basegfx::BColor aOtherColor = basegfx::tools::hsl2rgb( aHslLine ); + + // Compute the plain line + basegfx::B2DPolygon aLinePolygon; + aLinePolygon.append( aLeft ); + aLinePolygon.append( aRight ); + + drawinglayer::primitive2d::PolygonHairlinePrimitive2D * pPlainLine = + new drawinglayer::primitive2d::PolygonHairlinePrimitive2D( + aLinePolygon, aOtherColor ); + + aSeq[0] = drawinglayer::primitive2d::Primitive2DReference( pPlainLine ); + + // Dashed line in twips std::vector< double > aStrokePattern; aStrokePattern.push_back( 40 ); aStrokePattern.push_back( 40 ); - // Compute the dashed line primitive - basegfx::B2DPolygon aLinePolygon; - aLinePolygon.append( aLeft ); - aLinePolygon.append( aRight ); - drawinglayer::primitive2d::PolyPolygonStrokePrimitive2D * pLine = new drawinglayer::primitive2d::PolyPolygonStrokePrimitive2D ( basegfx::B2DPolyPolygon( aLinePolygon ), drawinglayer::attribute::LineAttribute( aLineColor ), drawinglayer::attribute::StrokeAttribute( aStrokePattern ) ); - aSeq[0] = drawinglayer::primitive2d::Primitive2DReference( pLine ); + aSeq[1] = drawinglayer::primitive2d::Primitive2DReference( pLine ); return aSeq; } diff --git a/sw/source/ui/docvw/HeaderFooterWin.cxx b/sw/source/ui/docvw/HeaderFooterWin.cxx index 65b4176f7515..d7c9c848199a 100644 --- a/sw/source/ui/docvw/HeaderFooterWin.cxx +++ b/sw/source/ui/docvw/HeaderFooterWin.cxx @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -69,16 +70,35 @@ namespace return basegfx::tools::hsl2rgb( aHslLine ); } + basegfx::BColor lcl_GetLighterGradientColor( basegfx::BColor aDarkColor ) + { + basegfx::BColor aHslDark = basegfx::tools::rgb2hsl( aDarkColor ); + double nLuminance = aHslDark.getZ() * 255 + 20; + aHslDark.setZ( nLuminance / 255.0 ); + return basegfx::tools::hsl2rgb( aHslDark ); + } + void lcl_DrawBackground( OutputDevice* pOut, const Rectangle& rRect, bool bHeader ) { // Colors basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor(); basegfx::BColor aFillColor = lcl_GetFillColor( aLineColor ); + basegfx::BColor aLighterColor = lcl_GetLighterGradientColor( aFillColor ); + + // Draw the background gradient + Gradient aGradient; + if ( bHeader ) + aGradient = Gradient( GRADIENT_LINEAR, + Color( aLighterColor ), Color( aFillColor ) ); + else + aGradient = Gradient( GRADIENT_LINEAR, + Color( aFillColor ), Color( aLighterColor ) ); + + pOut->DrawGradient( rRect, aGradient ); - // Draw the background rect pOut->SetFillColor( Color ( aFillColor ) ); pOut->SetLineColor( Color ( aFillColor ) ); - pOut->DrawRect( rRect ); + // Draw the lines around the rect pOut->SetLineColor( Color( aLineColor ) ); -- cgit