[PATCH] SIMIAN: Reduced duplicate code
Christina Rossmanith
ChrRossmanith at web.de
Tue Jan 31 01:07:19 PST 2012
---
vcl/source/gdi/outdev4.cxx | 118 +++++++++++++++++--------------------------
1 files changed, 47 insertions(+), 71 deletions(-)
diff --git a/vcl/source/gdi/outdev4.cxx b/vcl/source/gdi/outdev4.cxx
index 735a85e..63c53e4 100644
--- a/vcl/source/gdi/outdev4.cxx
+++ b/vcl/source/gdi/outdev4.cxx
@@ -168,6 +168,45 @@ inline sal_uInt8 ImplGetGradientColorValue( long nValue )
}
// -----------------------------------------------------------------------
+long ImplCalcGradientSteps( const Gradient& rGradient, const sal_Bool bMtf, const long nSize, const OutDevType outdevtype, const long nMaxSteps )
+{
+ long nStepCount;
+
+ // calculate number of steps if no value was passed in rGradient
+ if( !rGradient.GetSteps() )
+ {
+ long nInc;
+
+ if ( outdevtype != OUTDEV_PRINTER && !bMtf )
+ {
+ nInc = ( nSize < 50 ) ? 2 : 4;
+ }
+ else
+ {
+ // #105998# Use display-equivalent step size calculation
+ nInc = ( nSize < 800 ) ? 10 : 20;
+ }
+
+ if( !nInc )
+ nInc = 1; // (crossmanith: code reachable???)
+
+ nStepCount = nSize / nInc;
+ }
+ else {
+ nStepCount = rGradient.GetSteps();
+ }
+
+ // minimum number of steps: 3 (crossmanith: or is it 2?)
+ // maximum number of steps: nMaxSteps
+ long nSteps = Max( nStepCount, 2L );
+
+ if ( nSteps > nMaxSteps )
+ nSteps = nMaxSteps;
+ if ( !nSteps )
+ nSteps = 1;
+
+ return nSteps;
+}
void OutputDevice::ImplDrawLinearGradient( const Rectangle& rRect,
const Gradient& rGradient,
@@ -226,50 +265,19 @@ void OutputDevice::ImplDrawLinearGradient( const Rectangle& rRect,
long nRedSteps = nEndRed - nStartRed;
long nGreenSteps = nEndGreen - nStartGreen;
long nBlueSteps = nEndBlue - nStartBlue;
- long nStepCount = rGradient.GetSteps();
- // Bei nicht linearen Farbverlaeufen haben wir nur die halben Steps
+ // Bei axialen Farbverlaeufen haben wir nur die halben Steps
// pro Farbe
- if ( !bLinear )
+ if ( rGradient.GetStyle() == GRADIENT_AXIAL )
{
nRedSteps <<= 1;
nGreenSteps <<= 1;
nBlueSteps <<= 1;
}
- // Anzahl der Schritte berechnen, falls nichts uebergeben wurde
- if ( !nStepCount )
- {
- long nInc;
-
- if ( meOutDevType != OUTDEV_PRINTER && !bMtf )
- {
- nInc = (nMinRect < 50) ? 2 : 4;
- }
- else
- {
- // #105998# Use display-equivalent step size calculation
- nInc = (nMinRect < 800) ? 10 : 20;
- }
-
- if ( !nInc )
- nInc = 1;
-
- nStepCount = nMinRect / nInc;
- }
- // minimal drei Schritte und maximal die Anzahl der Farbunterschiede
- long nSteps = Max( nStepCount, 2L );
- long nCalcSteps = Abs( nRedSteps );
- long nTempSteps = Abs( nGreenSteps );
- if ( nTempSteps > nCalcSteps )
- nCalcSteps = nTempSteps;
- nTempSteps = Abs( nBlueSteps );
- if ( nTempSteps > nCalcSteps )
- nCalcSteps = nTempSteps;
- if ( nCalcSteps < nSteps )
- nSteps = nCalcSteps;
- if ( !nSteps )
- nSteps = 1;
+ // max(red,green,blue)
+ long nMaxGradientSteps = Max( Max( Abs( nRedSteps ), Abs( nGreenSteps ) ), Abs( nBlueSteps ));
+ long nSteps = ImplCalcGradientSteps( rGradient, bMtf, nMinRect, meOutDevType, nMaxGradientSteps );
// Falls axialer Farbverlauf, muss die Schrittanzahl ungerade sein
if ( !bLinear && !(nSteps & 1) )
@@ -437,7 +445,6 @@ void OutputDevice::ImplDrawComplexGradient( const Rectangle& rRect,
long nRedSteps = nEndRed - nStartRed;
long nGreenSteps = nEndGreen - nStartGreen;
long nBlueSteps = nEndBlue - nStartBlue;
- long nStepCount = rGradient.GetSteps();
sal_uInt16 nAngle = rGradient.GetAngle() % 3600;
rGradient.GetBoundRect( rRect, aRect, aCenter );
@@ -449,40 +456,9 @@ void OutputDevice::ImplDrawComplexGradient( const Rectangle& rRect,
long nMinRect = Min( aRect.GetWidth(), aRect.GetHeight() );
- // Anzahl der Schritte berechnen, falls nichts uebergeben wurde
- if( !nStepCount )
- {
- long nInc;
-
- if ( meOutDevType != OUTDEV_PRINTER && !bMtf )
- {
- nInc = ( nMinRect < 50 ) ? 2 : 4;
- }
- else
- {
- // #105998# Use display-equivalent step size calculation
- nInc = (nMinRect < 800) ? 10 : 20;
- }
-
- if( !nInc )
- nInc = 1;
-
- nStepCount = nMinRect / nInc;
- }
-
- // minimal drei Schritte und maximal die Anzahl der Farbunterschiede
- long nSteps = Max( nStepCount, 2L );
- long nCalcSteps = Abs( nRedSteps );
- long nTempSteps = Abs( nGreenSteps );
- if ( nTempSteps > nCalcSteps )
- nCalcSteps = nTempSteps;
- nTempSteps = Abs( nBlueSteps );
- if ( nTempSteps > nCalcSteps )
- nCalcSteps = nTempSteps;
- if ( nCalcSteps < nSteps )
- nSteps = nCalcSteps;
- if ( !nSteps )
- nSteps = 1;
+ // max(red,green,blue)
+ long nMaxGradientSteps = Max( Max( Abs( nRedSteps ), Abs( nGreenSteps ) ), Abs( nBlueSteps ));
+ long nSteps = ImplCalcGradientSteps( rGradient, bMtf, nMinRect, meOutDevType, nMaxGradientSteps );
// Ausgabebegrenzungen und Schrittweite fuer jede Richtung festlegen
Polygon aPoly;
--
1.7.4.1
--------------000704080902070408050400--
More information about the LibreOffice
mailing list