[Libreoffice-commits] core.git: 4 commits - basegfx/source cppcanvas/source drawinglayer/source include/basegfx include/drawinglayer sd/uiconfig

Caolán McNamara caolanm at redhat.com
Tue Jun 11 02:33:16 PDT 2013


 basegfx/source/tools/gradienttools.cxx                       |  433 +++++++----
 basegfx/source/tuple/b2ituple.cxx                            |   64 -
 cppcanvas/source/mtfrenderer/emfplus.cxx                     |    8 
 cppcanvas/source/mtfrenderer/implrenderer.cxx                |   24 
 drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx  |  170 ++--
 drawinglayer/source/processor2d/vclhelpergradient.cxx        |  116 +-
 drawinglayer/source/processor2d/vclprocessor2d.cxx           |    4 
 drawinglayer/source/texture/texture.cxx                      |  415 +++++-----
 include/basegfx/pixel/bpixel.hxx                             |   57 -
 include/basegfx/raster/rasterconvert3d.hxx                   |  148 +++
 include/basegfx/tools/gradienttools.hxx                      |  217 ++---
 include/basegfx/tuple/b2dtuple.hxx                           |   55 -
 include/basegfx/tuple/b2i64tuple.hxx                         |   56 -
 include/basegfx/tuple/b2ituple.hxx                           |   76 +
 include/basegfx/tuple/b3dtuple.hxx                           |   67 -
 include/basegfx/tuple/b3i64tuple.hxx                         |   66 -
 include/basegfx/tuple/b3ituple.hxx                           |   66 -
 include/drawinglayer/primitive2d/fillgradientprimitive2d.hxx |   13 
 include/drawinglayer/texture/texture.hxx                     |  127 ++-
 sd/uiconfig/simpress/ui/photoalbum.ui                        |  179 ++--
 20 files changed, 1378 insertions(+), 983 deletions(-)

New commits:
commit 140f9fa6dcbd9c3a49cc2027f140a7ec44ac06fe
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Jun 11 09:46:18 2013 +0100

    attempt to apply HIG rules to photo album dialog
    
    Change-Id: Ib1bed02d229d17c4ec5f0d95014e973c692914e2

diff --git a/sd/uiconfig/simpress/ui/photoalbum.ui b/sd/uiconfig/simpress/ui/photoalbum.ui
index b5ea76d..4560990 100644
--- a/sd/uiconfig/simpress/ui/photoalbum.ui
+++ b/sd/uiconfig/simpress/ui/photoalbum.ui
@@ -19,13 +19,11 @@
             <child>
               <object class="GtkButton" id="create_btn">
                 <property name="label" translatable="yes">Insert Slides</property>
-                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
                 <property name="has_default">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -36,11 +34,9 @@
             <child>
               <object class="GtkButton" id="cancel_btn">
                 <property name="label">gtk-cancel</property>
-                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -62,12 +58,16 @@
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="margin_top">6</property>
+            <property name="hexpand">True</property>
             <property name="vexpand">True</property>
+            <property name="spacing">12</property>
             <child>
               <object class="GtkBox" id="box1">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <property name="hexpand">True</property>
                 <property name="orientation">vertical</property>
+                <property name="spacing">6</property>
                 <child>
                   <object class="GtkScrolledWindow" id="scrolledwindow1">
                     <property name="width_request">300</property>
@@ -78,7 +78,7 @@
                     <property name="vexpand">True</property>
                     <property name="shadow_type">in</property>
                     <child>
-                      <object class="GtkTreeView" id="images_tree">
+                      <object class="GtkTreeView" id="images_tree:border">
                         <property name="width_request">300</property>
                         <property name="height_request">200</property>
                         <property name="visible">True</property>
@@ -104,15 +104,14 @@
                   <object class="GtkButtonBox" id="buttonbox1">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
+                    <property name="spacing">6</property>
                     <property name="layout_style">start</property>
                     <child>
                       <object class="GtkButton" id="add_btn">
                         <property name="label">gtk-add</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="use_stock">True</property>
                       </object>
                       <packing>
@@ -124,14 +123,12 @@
                     <child>
                       <object class="GtkButton" id="rem_btn">
                         <property name="label">gtk-remove</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
                         <property name="has_tooltip">True</property>
                         <property name="tooltip_markup" translatable="yes">Remove Image from List</property>
                         <property name="tooltip_text" translatable="yes">Remove Image from List</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="use_stock">True</property>
                       </object>
                       <packing>
@@ -143,14 +140,12 @@
                     <child>
                       <object class="GtkButton" id="up_btn">
                         <property name="label">gtk-go-up</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
                         <property name="has_tooltip">True</property>
                         <property name="tooltip_markup" translatable="yes">Move Image Up</property>
                         <property name="tooltip_text" translatable="yes">Move Image Up</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="use_stock">True</property>
                       </object>
                       <packing>
@@ -162,14 +157,12 @@
                     <child>
                       <object class="GtkButton" id="down_btn">
                         <property name="label">gtk-go-down</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
                         <property name="has_tooltip">True</property>
                         <property name="tooltip_markup" translatable="yes">Move Image Down</property>
                         <property name="tooltip_text" translatable="yes">Move Image Down</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="use_stock">True</property>
                       </object>
                       <packing>
@@ -193,21 +186,66 @@
               </packing>
             </child>
             <child>
-              <object class="GtkBox" id="box3">
+              <object class="GtkBox" id="box2">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="margin_left">6</property>
+                <property name="vexpand">True</property>
                 <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
                 <child>
-                  <object class="GtkLabel" id="label2">
+                  <object class="GtkFrame" id="frame1">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="margin_bottom">6</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Preview</property>
-                    <attributes>
-                      <attribute name="weight" value="bold"/>
-                    </attributes>
+                    <property name="vexpand">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="vexpand">True</property>
+                        <property name="top_padding">6</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkBox" id="box3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="vexpand">True</property>
+                            <property name="orientation">vertical</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <object class="GtkImage" id="preview_img">
+                                <property name="width_request">200</property>
+                                <property name="height_request">150</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="valign">start</property>
+                                <property name="vexpand">True</property>
+                                <property name="yalign">0</property>
+                                <property name="stock">gtk-missing-image</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="margin_bottom">6</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">Preview</property>
+                        <attributes>
+                          <attribute name="weight" value="bold"/>
+                        </attributes>
+                      </object>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -216,33 +254,49 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkImage" id="preview_img">
-                    <property name="width_request">200</property>
-                    <property name="height_request">150</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="valign">start</property>
-                    <property name="yalign">0</property>
-                    <property name="stock">gtk-missing-image</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
                   <object class="GtkBox" id="box5">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="margin_left">12</property>
+                    <property name="orientation">vertical</property>
                     <property name="spacing">6</property>
                     <child>
-                      <object class="GtkLabel" id="label7">
+                      <object class="GtkBox" id="box6">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="label" translatable="yes">Slide Layout</property>
-                        <property name="mnemonic_widget">opt_combo</property>
+                        <property name="spacing">12</property>
+                        <child>
+                          <object class="GtkLabel" id="label7">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">Slide Layout</property>
+                            <property name="mnemonic_widget">opt_combo</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkComboBox" id="opt_combo">
+                            <property name="width_request">160</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="model">liststore2</property>
+                            <property name="active">0</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="cellrenderertext1"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -251,18 +305,14 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkComboBox" id="opt_combo">
-                        <property name="width_request">160</property>
+                      <object class="GtkCheckButton" id="asr_check">
+                        <property name="label" translatable="yes">Keep Aspect Ratio</property>
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="model">liststore2</property>
-                        <property name="active">0</property>
-                        <child>
-                          <object class="GtkCellRendererText" id="cellrenderertext1"/>
-                          <attributes>
-                            <attribute name="text">0</attribute>
-                          </attributes>
-                        </child>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="xalign">0</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -274,33 +324,14 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">True</property>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="asr_check">
-                    <property name="label" translatable="yes">Keep Aspect Ratio</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="margin_left">12</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="xalign">0</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">5</property>
+                    <property name="position">1</property>
                   </packing>
                 </child>
               </object>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">True</property>
-                <property name="position">2</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </object>
commit 59db4be207ca6651a29366d326436ba2f40bb6ab
Author: Armin Le Grand <alg at apache.org>
Date:   Thu Oct 4 15:27:22 2012 +0000

    Related: #i120604# corrected 3d gradients
    
    adapted basegfx to be smarter in some areas
    
    (cherry picked from commit 888e64505474808166c29ada24178cc3e58d6c18)
    
    Conflicts:
    	basegfx/inc/basegfx/pixel/bpixel.hxx
    	basegfx/inc/basegfx/point/b2dhompoint.hxx
    	basegfx/inc/basegfx/point/b3dhompoint.hxx
    	basegfx/inc/basegfx/raster/rasterconvert3d.hxx
    	basegfx/inc/basegfx/tuple/b2dtuple.hxx
    	basegfx/inc/basegfx/tuple/b2i64tuple.hxx
    	basegfx/inc/basegfx/tuple/b2ituple.hxx
    	basegfx/inc/basegfx/tuple/b3dtuple.hxx
    	basegfx/inc/basegfx/tuple/b3i64tuple.hxx
    	basegfx/inc/basegfx/tuple/b3ituple.hxx
    	basegfx/source/point/b2dhompoint.cxx
    	basegfx/source/tuple/b2ituple.cxx
    
    Change-Id: Id92864093dd40d34bd20b130cc3b405a7b8f9d91

diff --git a/basegfx/source/tools/gradienttools.cxx b/basegfx/source/tools/gradienttools.cxx
index 83b6e21..11bd62f 100644
--- a/basegfx/source/tools/gradienttools.cxx
+++ b/basegfx/source/tools/gradienttools.cxx
@@ -355,19 +355,20 @@ namespace basegfx
         {
             const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
 
-            if(aCoor.getX() < 0.0 || aCoor.getX() > 1.0)
-            {
-                return 0.0;
-            }
+            // Ignore Y, this is not needed at all for Y-Oriented gradients
+            // if(aCoor.getX() < 0.0 || aCoor.getX() > 1.0)
+            // {
+            //     return 0.0;
+            // }
 
             if(aCoor.getY() <= 0.0)
             {
-                return 0.0;
+                return 0.0; // start value for inside
             }
 
             if(aCoor.getY() >= 1.0)
             {
-                return 1.0;
+                return 1.0; // end value for outside
             }
 
             const sal_uInt32 nSteps(rGradInfo.getSteps());
@@ -384,16 +385,17 @@ namespace basegfx
         {
             const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
 
-            if(aCoor.getX() < 0.0 || aCoor.getX() > 1.0)
-            {
-                return 0.0;
-            }
+            // Ignore Y, this is not needed at all for Y-Oriented gradients
+            //if(aCoor.getX() < 0.0 || aCoor.getX() > 1.0)
+            //{
+            //    return 0.0;
+            //}
 
             const double fAbsY(fabs(aCoor.getY()));
 
             if(fAbsY >= 1.0)
             {
-                return 0.0;
+                return 1.0; // use end value when outside in Y
             }
 
             const sal_uInt32 nSteps(rGradInfo.getSteps());
diff --git a/basegfx/source/tuple/b2ituple.cxx b/basegfx/source/tuple/b2ituple.cxx
index 786699b..f70ac73 100644
--- a/basegfx/source/tuple/b2ituple.cxx
+++ b/basegfx/source/tuple/b2ituple.cxx
@@ -23,68 +23,4 @@
 
 namespace { struct EmptyTuple : public rtl::Static<basegfx::B2ITuple, EmptyTuple> {}; }
 
-namespace basegfx
-{
-    // external operators
-    //////////////////////////////////////////////////////////////////////////
-
-    B2ITuple operator+(const B2ITuple& rTupA, const B2ITuple& rTupB)
-    {
-        B2ITuple aSum(rTupA);
-        aSum += rTupB;
-        return aSum;
-    }
-
-    B2ITuple operator-(const B2ITuple& rTupA, const B2ITuple& rTupB)
-    {
-        B2ITuple aSub(rTupA);
-        aSub -= rTupB;
-        return aSub;
-    }
-
-    B2ITuple operator/(const B2ITuple& rTupA, const B2ITuple& rTupB)
-    {
-        B2ITuple aDiv(rTupA);
-        aDiv /= rTupB;
-        return aDiv;
-    }
-
-    B2ITuple operator*(const B2ITuple& rTupA, const B2ITuple& rTupB)
-    {
-        B2ITuple aMul(rTupA);
-        aMul *= rTupB;
-        return aMul;
-    }
-
-    B2ITuple operator*(const B2ITuple& rTup, sal_Int32 t)
-    {
-        B2ITuple aNew(rTup);
-        aNew *= t;
-        return aNew;
-    }
-
-    B2ITuple operator*(sal_Int32 t, const B2ITuple& rTup)
-    {
-        B2ITuple aNew(rTup);
-        aNew *= t;
-        return aNew;
-    }
-
-    B2ITuple operator/(const B2ITuple& rTup, sal_Int32 t)
-    {
-        B2ITuple aNew(rTup);
-        aNew /= t;
-        return aNew;
-    }
-
-    B2ITuple operator/(sal_Int32 t, const B2ITuple& rTup)
-    {
-        B2ITuple aNew(t, t);
-        B2ITuple aTmp(rTup);
-        aNew /= aTmp;
-        return aNew;
-    }
-
-} // end of namespace basegfx
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/drawinglayer/source/texture/texture.cxx b/drawinglayer/source/texture/texture.cxx
index c42f75c..f69c973 100644
--- a/drawinglayer/source/texture/texture.cxx
+++ b/drawinglayer/source/texture/texture.cxx
@@ -157,7 +157,7 @@ namespace drawinglayer
         {
             const double fScaler(basegfx::tools::getLinearGradientAlpha(rUV, maGradientInfo));
 
-            rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
+            rBColor = basegfx::interpolate(maStart, maEnd, fScaler);
         }
     } // end of namespace texture
 } // end of namespace drawinglayer
@@ -220,7 +220,7 @@ namespace drawinglayer
         {
             const double fScaler(basegfx::tools::getAxialGradientAlpha(rUV, maGradientInfo));
 
-            rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
+            rBColor = basegfx::interpolate(maStart, maEnd, fScaler);
         }
     } // end of namespace texture
 } // end of namespace drawinglayer
@@ -277,7 +277,7 @@ namespace drawinglayer
         {
             const double fScaler(basegfx::tools::getRadialGradientAlpha(rUV, maGradientInfo));
 
-            rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
+            rBColor = basegfx::interpolate(maStart, maEnd, fScaler);
         }
     } // end of namespace texture
 } // end of namespace drawinglayer
@@ -354,7 +354,7 @@ namespace drawinglayer
         {
             const double fScaler(basegfx::tools::getEllipticalGradientAlpha(rUV, maGradientInfo));
 
-            rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
+            rBColor = basegfx::interpolate(maStart, maEnd, fScaler);
         }
     } // end of namespace texture
 } // end of namespace drawinglayer
@@ -413,7 +413,7 @@ namespace drawinglayer
         {
             const double fScaler(basegfx::tools::getSquareGradientAlpha(rUV, maGradientInfo));
 
-            rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
+            rBColor = basegfx::interpolate(maStart, maEnd, fScaler);
         }
     } // end of namespace texture
 } // end of namespace drawinglayer
@@ -490,7 +490,7 @@ namespace drawinglayer
         {
             const double fScaler(basegfx::tools::getRectangularGradientAlpha(rUV, maGradientInfo));
 
-            rBColor = (maStart * (1.0 - fScaler)) + (maEnd * fScaler);
+            rBColor = basegfx::interpolate(maStart, maEnd, fScaler);
         }
     } // end of namespace texture
 } // end of namespace drawinglayer
diff --git a/include/basegfx/pixel/bpixel.hxx b/include/basegfx/pixel/bpixel.hxx
index a2c5910..41c8c5f 100644
--- a/include/basegfx/pixel/bpixel.hxx
+++ b/include/basegfx/pixel/bpixel.hxx
@@ -135,22 +135,20 @@ namespace basegfx
 
     inline BPixel minimum(const BPixel& rTupA, const BPixel& rTupB)
     {
-        BPixel aMin(
-            (rTupB.getRed() < rTupA.getRed()) ? rTupB.getRed() : rTupA.getRed(),
-            (rTupB.getGreen() < rTupA.getGreen()) ? rTupB.getGreen() : rTupA.getGreen(),
-            (rTupB.getBlue() < rTupA.getBlue()) ? rTupB.getBlue() : rTupA.getBlue(),
-            (rTupB.getOpacity() < rTupA.getOpacity()) ? rTupB.getOpacity() : rTupA.getOpacity());
-        return aMin;
+        return BPixel(
+            std::min(rTupB.getRed(), rTupA.getRed()),
+            std::min(rTupB.getGreen(), rTupA.getGreen()),
+            std::min(rTupB.getBlue(), rTupA.getBlue()),
+            std::min(rTupB.getOpacity(), rTupA.getOpacity()));
     }
 
     inline BPixel maximum(const BPixel& rTupA, const BPixel& rTupB)
     {
-        BPixel aMax(
-            (rTupB.getRed() > rTupA.getRed()) ? rTupB.getRed() : rTupA.getRed(),
-            (rTupB.getGreen() > rTupA.getGreen()) ? rTupB.getGreen() : rTupA.getGreen(),
-            (rTupB.getBlue() > rTupA.getBlue()) ? rTupB.getBlue() : rTupA.getBlue(),
-            (rTupB.getOpacity() > rTupA.getOpacity()) ? rTupB.getOpacity() : rTupA.getOpacity());
-        return aMax;
+        return BPixel(
+            std::max(rTupB.getRed(), rTupA.getRed()),
+            std::max(rTupB.getGreen(), rTupA.getGreen()),
+            std::max(rTupB.getBlue(), rTupA.getBlue()),
+            std::max(rTupB.getOpacity(), rTupA.getOpacity()));
     }
 
     inline BPixel interpolate(const BPixel& rOld1, const BPixel& rOld2, double t)
@@ -171,6 +169,7 @@ namespace basegfx
         {
             const sal_uInt32 nFactor(fround(256.0 * t));
             const sal_uInt32 nNegFac(256L - nFactor);
+
             return BPixel(
                 (sal_uInt8)(((sal_uInt32)rOld1.getRed() * nNegFac + (sal_uInt32)rOld2.getRed() * nFactor) >> 8L),
                 (sal_uInt8)(((sal_uInt32)rOld1.getGreen() * nNegFac + (sal_uInt32)rOld2.getGreen() * nFactor) >> 8L),
@@ -181,34 +180,20 @@ namespace basegfx
 
     inline BPixel average(const BPixel& rOld1, const BPixel& rOld2)
     {
-        if(rOld1 == rOld2)
-        {
-            return rOld1;
-        }
-        else
-        {
-            return BPixel(
-                (sal_uInt8)(((sal_uInt32)rOld1.getRed() + (sal_uInt32)rOld2.getRed()) >> 1L),
-                (sal_uInt8)(((sal_uInt32)rOld1.getGreen() + (sal_uInt32)rOld2.getGreen()) >> 1L),
-                (sal_uInt8)(((sal_uInt32)rOld1.getBlue() + (sal_uInt32)rOld2.getBlue()) >> 1L),
-                (sal_uInt8)(((sal_uInt32)rOld1.getOpacity() + (sal_uInt32)rOld2.getOpacity()) >> 1L));
-        }
+        return BPixel(
+            rOld1.getRed() == rOld2.getRed() ? rOld1.getRed() : (sal_uInt8)(((sal_uInt32)rOld1.getRed() + (sal_uInt32)rOld2.getRed()) >> 1L),
+            rOld1.getGreen() == rOld2.getGreen() ? rOld1.getGreen() : (sal_uInt8)(((sal_uInt32)rOld1.getGreen() + (sal_uInt32)rOld2.getGreen()) >> 1L),
+            rOld1.getBlue() == rOld2.getBlue() ? rOld1.getBlue() : (sal_uInt8)(((sal_uInt32)rOld1.getBlue() + (sal_uInt32)rOld2.getBlue()) >> 1L),
+            rOld1.getOpacity() == rOld2.getOpacity() ? rOld1.getOpacity() : (sal_uInt8)(((sal_uInt32)rOld1.getOpacity() + (sal_uInt32)rOld2.getOpacity()) >> 1L));
     }
 
     inline BPixel average(const BPixel& rOld1, const BPixel& rOld2, const BPixel& rOld3)
     {
-        if(rOld1 == rOld2 && rOld2 == rOld3)
-        {
-            return rOld1;
-        }
-        else
-        {
-            return BPixel(
-                (sal_uInt8)(((sal_uInt32)rOld1.getRed() + (sal_uInt32)rOld2.getRed() + (sal_uInt32)rOld3.getRed()) / 3L),
-                (sal_uInt8)(((sal_uInt32)rOld1.getGreen() + (sal_uInt32)rOld2.getGreen() + (sal_uInt32)rOld3.getGreen()) / 3L),
-                (sal_uInt8)(((sal_uInt32)rOld1.getBlue() + (sal_uInt32)rOld2.getBlue() + (sal_uInt32)rOld3.getBlue()) / 3L),
-                (sal_uInt8)(((sal_uInt32)rOld1.getOpacity() + (sal_uInt32)rOld2.getOpacity() + (sal_uInt32)rOld3.getOpacity()) / 3L));
-        }
+        return BPixel(
+            (rOld1.getRed() == rOld2.getRed() && rOld2.getRed() == rOld3.getRed()) ? rOld1.getRed() : (sal_uInt8)(((sal_uInt32)rOld1.getRed() + (sal_uInt32)rOld2.getRed() + (sal_uInt32)rOld3.getRed()) / 3L),
+            (rOld1.getGreen() == rOld2.getGreen() && rOld2.getGreen() == rOld3.getGreen()) ? rOld1.getGreen() : (sal_uInt8)(((sal_uInt32)rOld1.getGreen() + (sal_uInt32)rOld2.getGreen() + (sal_uInt32)rOld3.getGreen()) / 3L),
+            (rOld1.getBlue() == rOld2.getBlue() && rOld2.getBlue() == rOld3.getBlue()) ? rOld1.getBlue() : (sal_uInt8)(((sal_uInt32)rOld1.getBlue() + (sal_uInt32)rOld2.getBlue() + (sal_uInt32)rOld3.getBlue()) / 3L),
+            (rOld1.getOpacity() == rOld2.getOpacity() && rOld2.getOpacity() == rOld3.getOpacity()) ? rOld1.getOpacity() : (sal_uInt8)(((sal_uInt32)rOld1.getOpacity() + (sal_uInt32)rOld2.getOpacity() + (sal_uInt32)rOld3.getOpacity()) / 3L));
     }
 } // end of namespace basegfx
 
diff --git a/include/basegfx/raster/rasterconvert3d.hxx b/include/basegfx/raster/rasterconvert3d.hxx
index 1bfbe20..8ffa6f5 100644
--- a/include/basegfx/raster/rasterconvert3d.hxx
+++ b/include/basegfx/raster/rasterconvert3d.hxx
@@ -141,42 +141,152 @@ namespace basegfx
     protected:
         sal_uInt32 addColorInterpolator(const BColor& rA, const BColor& rB, double fInvYDelta)
         {
-            B3DVector aDelta(rB.getRed() - rA.getRed(), rB.getGreen() - rA.getGreen(), rB.getBlue() - rA.getBlue());
-            aDelta *= fInvYDelta;
-            maColorInterpolators.push_back(ip_triple(rA.getRed(), aDelta.getX(), rA.getGreen(), aDelta.getY(), rA.getBlue(), aDelta.getZ()));
-            return (maColorInterpolators.size() - 1L);
+            double aDeltaRed(rB.getRed() - rA.getRed());
+
+            if(fTools::equalZero(aDeltaRed))
+            {
+                aDeltaRed = 0.0;
+            }
+            else
+            {
+                aDeltaRed *= fInvYDelta;
+            }
+
+            double aDeltaGreen(rB.getGreen() - rA.getGreen());
+
+            if(fTools::equalZero(aDeltaGreen))
+            {
+                aDeltaGreen = 0.0;
+            }
+            else
+            {
+                aDeltaGreen *= fInvYDelta;
+            }
+
+            double aDeltaBlue(rB.getBlue() - rA.getBlue());
+
+            if(fTools::equalZero(aDeltaBlue))
+            {
+                aDeltaBlue = 0.0;
+            }
+            else
+            {
+                aDeltaBlue *= fInvYDelta;
+            }
+
+            maColorInterpolators.push_back(
+                ip_triple(
+                    rA.getRed(), aDeltaRed,
+                    rA.getGreen(), aDeltaGreen,
+                    rA.getBlue(), aDeltaBlue));
+
+            return (maColorInterpolators.size() - 1);
         }
 
         sal_uInt32 addNormalInterpolator(const B3DVector& rA, const B3DVector& rB, double fInvYDelta)
         {
-            B3DVector aDelta(rB.getX() - rA.getX(), rB.getY() - rA.getY(), rB.getZ() - rA.getZ());
-            aDelta *= fInvYDelta;
-            maNormalInterpolators.push_back(ip_triple(rA.getX(), aDelta.getX(), rA.getY(), aDelta.getY(), rA.getZ(), aDelta.getZ()));
-            return (maNormalInterpolators.size() - 1L);
+            double aDeltaX(rB.getX() - rA.getX());
+
+            if(fTools::equalZero(aDeltaX))
+            {
+                aDeltaX = 0.0;
+            }
+            else
+            {
+                aDeltaX *= fInvYDelta;
+            }
+
+            double aDeltaY(rB.getY() - rA.getY());
+
+            if(fTools::equalZero(aDeltaY))
+            {
+                aDeltaY = 0.0;
+            }
+            else
+            {
+                aDeltaY *= fInvYDelta;
+            }
+
+            double aDeltaZ(rB.getZ() - rA.getZ());
+
+            if(fTools::equalZero(aDeltaZ))
+            {
+                aDeltaZ = 0.0;
+            }
+            else
+            {
+                aDeltaZ *= fInvYDelta;
+            }
+
+            maNormalInterpolators.push_back(
+                ip_triple(
+                    rA.getX(), aDeltaX,
+                    rA.getY(), aDeltaY,
+                    rA.getZ(), aDeltaZ));
+
+            return (maNormalInterpolators.size() - 1);
         }
 
         sal_uInt32 addTextureInterpolator(const B2DPoint& rA, const B2DPoint& rB, double fInvYDelta)
         {
-            B2DVector aDelta(rB.getX() - rA.getX(), rB.getY() - rA.getY());
-            aDelta *= fInvYDelta;
-            maTextureInterpolators.push_back(ip_double(rA.getX(), aDelta.getX(), rA.getY(), aDelta.getY()));
-            return (maTextureInterpolators.size() - 1L);
+            double aDeltaX(rB.getX() - rA.getX());
+
+            if(fTools::equalZero(aDeltaX))
+            {
+                aDeltaX = 0.0;
+            }
+            else
+            {
+                aDeltaX *= fInvYDelta;
+            }
+
+            double aDeltaY(rB.getY() - rA.getY());
+
+            if(fTools::equalZero(aDeltaY))
+            {
+                aDeltaY = 0.0;
+            }
+            else
+            {
+                aDeltaY *= fInvYDelta;
+            }
+
+            maTextureInterpolators.push_back(
+                ip_double(
+                    rA.getX(), aDeltaX,
+                    rA.getY(), aDeltaY));
+
+            return (maTextureInterpolators.size() - 1);
         }
 
         sal_uInt32 addInverseTextureInterpolator(const B2DPoint& rA, const B2DPoint& rB, double fZEyeA, double fZEyeB, double fInvYDelta)
         {
+            double fZDelta(fZEyeB - fZEyeA);
             const double fInvZEyeA(fTools::equalZero(fZEyeA) ? fZEyeA : 1.0 / fZEyeA);
-            const double fInvZEyeB(fTools::equalZero(fZEyeB) ? fZEyeB : 1.0 / fZEyeB);
+            double fInvZEyeB(fInvZEyeA);
+
+            if(fTools::equalZero(fZDelta))
+            {
+                fZDelta = 0.0;
+            }
+            else
+            {
+                fInvZEyeB = fTools::equalZero(fZEyeB) ? fZEyeB : 1.0 / fZEyeB;
+                fZDelta = (fInvZEyeB - fInvZEyeA) * fInvYDelta;
+            }
+
             const B2DPoint aInvA(rA * fInvZEyeA);
             const B2DPoint aInvB(rB * fInvZEyeB);
-            double fZDelta(fInvZEyeB - fInvZEyeA);
-            B2DVector aDelta(aInvB.getX() - aInvA.getX(), aInvB.getY() - aInvA.getY());
+            const double aDeltaX((aInvB.getX() - aInvA.getX()) * fInvYDelta);
+            const double aDeltaY((aInvB.getY() - aInvA.getY()) * fInvYDelta);
 
-            fZDelta *= fInvYDelta;
-            aDelta *= fInvYDelta;
+            maInverseTextureInterpolators.push_back(
+                ip_triple(
+                    aInvA.getX(), aDeltaX,
+                    aInvA.getY(), aDeltaY,
+                    fInvZEyeA, fZDelta));
 
-            maInverseTextureInterpolators.push_back(ip_triple(aInvA.getX(), aDelta.getX(), aInvA.getY(), aDelta.getY(), fInvZEyeA, fZDelta));
-            return (maInverseTextureInterpolators.size() - 1L);
+            return (maInverseTextureInterpolators.size() - 1);
         }
 
         void reset()
diff --git a/include/basegfx/tuple/b2dtuple.hxx b/include/basegfx/tuple/b2dtuple.hxx
index 380ba8a..ac2b78f 100644
--- a/include/basegfx/tuple/b2dtuple.hxx
+++ b/include/basegfx/tuple/b2dtuple.hxx
@@ -22,6 +22,7 @@
 
 #include <sal/types.h>
 #include <basegfx/numeric/ftools.hxx>
+#include <algorithm>
 #include <basegfx/basegfxdllapi.h>
 
 namespace basegfx
@@ -237,50 +238,60 @@ namespace basegfx
 
     inline B2DTuple minimum(const B2DTuple& rTupA, const B2DTuple& rTupB)
     {
-        B2DTuple aMin(
-            (rTupB.getX() < rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() < rTupA.getY()) ? rTupB.getY() : rTupA.getY());
-        return aMin;
+        return B2DTuple(
+            std::min(rTupB.getX(), rTupA.getX()),
+            std::min(rTupB.getY(), rTupA.getY()));
     }
 
     inline B2DTuple maximum(const B2DTuple& rTupA, const B2DTuple& rTupB)
     {
-        B2DTuple aMax(
-            (rTupB.getX() > rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() > rTupA.getY()) ? rTupB.getY() : rTupA.getY());
-        return aMax;
+        return B2DTuple(
+            std::max(rTupB.getX(), rTupA.getX()),
+            std::max(rTupB.getY(), rTupA.getY()));
     }
 
     inline B2DTuple absolute(const B2DTuple& rTup)
     {
         B2DTuple aAbs(
-            (0.0 > rTup.getX()) ? -rTup.getX() : rTup.getX(),
-            (0.0 > rTup.getY()) ? -rTup.getY() : rTup.getY());
+            fabs(rTup.getX()),
+            fabs(rTup.getY()));
         return aAbs;
     }
 
     inline B2DTuple interpolate(const B2DTuple& rOld1, const B2DTuple& rOld2, double t)
     {
-        B2DTuple aInt(
-            ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
-            ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY());
-        return aInt;
+        if(rOld1 == rOld2)
+        {
+            return rOld1;
+        }
+        else if(0.0 >= t)
+        {
+            return rOld1;
+        }
+        else if(1.0 <= t)
+        {
+            return rOld2;
+        }
+        else
+        {
+            return B2DTuple(
+                ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
+                ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY());
+        }
     }
 
     inline B2DTuple average(const B2DTuple& rOld1, const B2DTuple& rOld2)
     {
-        B2DTuple aAvg(
-            (rOld1.getX() + rOld2.getX()) * 0.5,
-            (rOld1.getY() + rOld2.getY()) * 0.5);
-        return aAvg;
+        return B2DTuple(
+            rOld1.getX() == rOld2.getX() ? rOld1.getX() : (rOld1.getX() + rOld2.getX()) * 0.5,
+            rOld1.getY() == rOld2.getY() ? rOld1.getY() : (rOld1.getY() + rOld2.getY()) * 0.5);
     }
 
     inline B2DTuple average(const B2DTuple& rOld1, const B2DTuple& rOld2, const B2DTuple& rOld3)
     {
-        B2DTuple aAvg(
-            (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
-            (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0));
-        return aAvg;
+        return B2DTuple(
+            (rOld1.getX() == rOld2.getX() && rOld2.getX() == rOld3.getX()) ? rOld1.getX() : (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
+            (rOld1.getY() == rOld2.getY() && rOld2.getY() == rOld3.getY()) ? rOld1.getY() : (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0));
     }
 
     inline B2DTuple operator+(const B2DTuple& rTupA, const B2DTuple& rTupB)
diff --git a/include/basegfx/tuple/b2i64tuple.hxx b/include/basegfx/tuple/b2i64tuple.hxx
index debb4ca..13ac79b 100644
--- a/include/basegfx/tuple/b2i64tuple.hxx
+++ b/include/basegfx/tuple/b2i64tuple.hxx
@@ -196,18 +196,16 @@ namespace basegfx
 
     inline B2I64Tuple minimum(const B2I64Tuple& rTupA, const B2I64Tuple& rTupB)
     {
-        B2I64Tuple aMin(
-            (rTupB.getX() < rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() < rTupA.getY()) ? rTupB.getY() : rTupA.getY());
-        return aMin;
+        return B2I64Tuple(
+            std::min(rTupB.getX(), rTupA.getX()),
+            std::min(rTupB.getY(), rTupA.getY()));
     }
 
     inline B2I64Tuple maximum(const B2I64Tuple& rTupA, const B2I64Tuple& rTupB)
     {
-        B2I64Tuple aMax(
-            (rTupB.getX() > rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() > rTupA.getY()) ? rTupB.getY() : rTupA.getY());
-        return aMax;
+        return B2I64Tuple(
+            std::max(rTupB.getX(), rTupA.getX()),
+            std::max(rTupB.getY(), rTupA.getY()));
     }
 
     inline B2I64Tuple absolute(const B2I64Tuple& rTup)
@@ -218,28 +216,40 @@ namespace basegfx
         return aAbs;
     }
 
-    inline B2DTuple interpolate(const B2I64Tuple& rOld1, const B2I64Tuple& rOld2, double t)
+    inline B2I64Tuple interpolate(const B2I64Tuple& rOld1, const B2I64Tuple& rOld2, double t)
     {
-        B2DTuple aInt(
-            ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
-            ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY());
-        return aInt;
+        if(rOld1 == rOld2)
+        {
+            return rOld1;
+        }
+        else if(0.0 >= t)
+        {
+            return rOld1;
+        }
+        else if(1.0 <= t)
+        {
+            return rOld2;
+        }
+        else
+        {
+            return B2I64Tuple(
+                basegfx::fround64(((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX()),
+                basegfx::fround64(((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY()));
+        }
     }
 
-    inline B2DTuple average(const B2I64Tuple& rOld1, const B2I64Tuple& rOld2)
+    inline B2I64Tuple average(const B2I64Tuple& rOld1, const B2I64Tuple& rOld2)
     {
-        B2DTuple aAvg(
-            (rOld1.getX() + rOld2.getX()) * 0.5,
-            (rOld1.getY() + rOld2.getY()) * 0.5);
-        return aAvg;
+        return B2I64Tuple(
+            rOld1.getX() == rOld2.getX() ? rOld1.getX() : basegfx::fround64((rOld1.getX() + rOld2.getX()) * 0.5),
+            rOld1.getY() == rOld2.getY() ? rOld1.getY() : basegfx::fround64((rOld1.getY() + rOld2.getY()) * 0.5));
     }
 
-    inline B2DTuple average(const B2I64Tuple& rOld1, const B2I64Tuple& rOld2, const B2I64Tuple& rOld3)
+    inline B2I64Tuple average(const B2I64Tuple& rOld1, const B2I64Tuple& rOld2, const B2I64Tuple& rOld3)
     {
-        B2DTuple aAvg(
-            (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
-            (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0));
-        return aAvg;
+        return B2I64Tuple(
+            (rOld1.getX() == rOld2.getX() && rOld2.getX() == rOld3.getX()) ? rOld1.getX() : basegfx::fround64((rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0)),
+            (rOld1.getY() == rOld2.getY() && rOld2.getY() == rOld3.getY()) ? rOld1.getY() : basegfx::fround64((rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0)));
     }
 
     inline B2I64Tuple operator+(const B2I64Tuple& rTupA, const B2I64Tuple& rTupB)
diff --git a/include/basegfx/tuple/b2ituple.hxx b/include/basegfx/tuple/b2ituple.hxx
index 41203a0..546cbba 100644
--- a/include/basegfx/tuple/b2ituple.hxx
+++ b/include/basegfx/tuple/b2ituple.hxx
@@ -21,6 +21,8 @@
 #define _BGFX_TUPLE_B2ITUPLE_HXX
 
 #include <sal/types.h>
+#include <basegfx/numeric/ftools.hxx>
+#include <algorithm>
 #include <basegfx/basegfxdllapi.h>
 
 namespace basegfx
@@ -169,7 +171,10 @@ namespace basegfx
             return B2ITuple(-mnX, -mnY);
         }
 
-        bool equalZero() const { return mnX == 0 && mnY == 0; }
+        bool equalZero() const
+        {
+            return mnX == 0 && mnY == 0;
+        }
 
         bool operator==( const B2ITuple& rTup ) const
         {
@@ -191,16 +196,65 @@ namespace basegfx
 
     // external operators
     //////////////////////////////////////////////////////////////////////////
-    class B2DTuple;
-
-    BASEGFX_DLLPUBLIC B2ITuple operator+(const B2ITuple& rTupA, const B2ITuple& rTupB);
-    BASEGFX_DLLPUBLIC B2ITuple operator-(const B2ITuple& rTupA, const B2ITuple& rTupB);
-    BASEGFX_DLLPUBLIC B2ITuple operator/(const B2ITuple& rTupA, const B2ITuple& rTupB);
-    BASEGFX_DLLPUBLIC B2ITuple operator*(const B2ITuple& rTupA, const B2ITuple& rTupB);
-    BASEGFX_DLLPUBLIC B2ITuple operator*(const B2ITuple& rTup, sal_Int32 t);
-    BASEGFX_DLLPUBLIC B2ITuple operator*(sal_Int32 t, const B2ITuple& rTup);
-    BASEGFX_DLLPUBLIC B2ITuple operator/(const B2ITuple& rTup, sal_Int32 t);
-    BASEGFX_DLLPUBLIC B2ITuple operator/(sal_Int32 t, const B2ITuple& rTup);
+
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator+(const B2ITuple& rTupA, const B2ITuple& rTupB)
+    {
+        B2ITuple aSum(rTupA);
+        aSum += rTupB;
+        return aSum;
+    }
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator-(const B2ITuple& rTupA, const B2ITuple& rTupB)
+    {
+        B2ITuple aSub(rTupA);
+        aSub -= rTupB;
+        return aSub;
+    }
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator/(const B2ITuple& rTupA, const B2ITuple& rTupB)
+    {
+        B2ITuple aDiv(rTupA);
+        aDiv /= rTupB;
+        return aDiv;
+    }
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator*(const B2ITuple& rTupA, const B2ITuple& rTupB)
+    {
+        B2ITuple aMul(rTupA);
+        aMul *= rTupB;
+        return aMul;
+    }
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator*(const B2ITuple& rTup, sal_Int32 t)
+    {
+        B2ITuple aNew(rTup);
+        aNew *= t;
+        return aNew;
+    }
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator*(sal_Int32 t, const B2ITuple& rTup)
+    {
+        B2ITuple aNew(rTup);
+        aNew *= t;
+        return aNew;
+    }
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator/(const B2ITuple& rTup, sal_Int32 t)
+    {
+        B2ITuple aNew(rTup);
+        aNew /= t;
+        return aNew;
+    }
+
+    BASEGFX_DLLPUBLIC inline B2ITuple operator/(sal_Int32 t, const B2ITuple& rTup)
+    {
+        B2ITuple aNew(t, t);
+        B2ITuple aTmp(rTup);
+        aNew /= aTmp;
+        return aNew;
+    }
+
 } // end of namespace basegfx
 
 #endif /* _BGFX_TUPLE_B2ITUPLE_HXX */
diff --git a/include/basegfx/tuple/b3dtuple.hxx b/include/basegfx/tuple/b3dtuple.hxx
index 1eb4dd3..9d8d080 100644
--- a/include/basegfx/tuple/b3dtuple.hxx
+++ b/include/basegfx/tuple/b3dtuple.hxx
@@ -22,6 +22,7 @@
 
 #include <sal/types.h>
 #include <basegfx/numeric/ftools.hxx>
+#include <algorithm>
 #include <basegfx/basegfxdllapi.h>
 
 namespace basegfx
@@ -301,56 +302,66 @@ namespace basegfx
 
     inline B3DTuple minimum(const B3DTuple& rTupA, const B3DTuple& rTupB)
     {
-        B3DTuple aMin(
-            (rTupB.getX() < rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() < rTupA.getY()) ? rTupB.getY() : rTupA.getY(),
-            (rTupB.getZ() < rTupA.getZ()) ? rTupB.getZ() : rTupA.getZ());
-        return aMin;
+        return B3DTuple(
+            std::min(rTupB.getX(), rTupA.getX()),
+            std::min(rTupB.getY(), rTupA.getY()),
+            std::min(rTupB.getZ(), rTupA.getZ()));
     }
 
     inline B3DTuple maximum(const B3DTuple& rTupA, const B3DTuple& rTupB)
     {
-        B3DTuple aMax(
-            (rTupB.getX() > rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() > rTupA.getY()) ? rTupB.getY() : rTupA.getY(),
-            (rTupB.getZ() > rTupA.getZ()) ? rTupB.getZ() : rTupA.getZ());
-        return aMax;
+        return B3DTuple(
+            std::max(rTupB.getX(), rTupA.getX()),
+            std::max(rTupB.getY(), rTupA.getY()),
+            std::max(rTupB.getZ(), rTupA.getZ()));
     }
 
     inline B3DTuple absolute(const B3DTuple& rTup)
     {
         B3DTuple aAbs(
-            (0.0 > rTup.getX()) ? -rTup.getX() : rTup.getX(),
-            (0.0 > rTup.getY()) ? -rTup.getY() : rTup.getY(),
-            (0.0 > rTup.getZ()) ? -rTup.getZ() : rTup.getZ());
+            fabs(rTup.getX()),
+            fabs(rTup.getY()),
+            fabs(rTup.getZ()));
         return aAbs;
     }
 
     inline B3DTuple interpolate(const B3DTuple& rOld1, const B3DTuple& rOld2, double t)
     {
-        B3DTuple aInt(
-            ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
-            ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY(),
-            ((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ());
-        return aInt;
+        if(rOld1 == rOld2)
+        {
+            return rOld1;
+        }
+        else if(0.0 >= t)
+        {
+            return rOld1;
+        }
+        else if(1.0 <= t)
+        {
+            return rOld2;
+        }
+        else
+        {
+            return B3DTuple(
+                ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
+                ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY(),
+                ((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ());
+        }
     }
 
     inline B3DTuple average(const B3DTuple& rOld1, const B3DTuple& rOld2)
     {
-        B3DTuple aAvg(
-            (rOld1.getX() + rOld2.getX()) * 0.5,
-            (rOld1.getY() + rOld2.getY()) * 0.5,
-            (rOld1.getZ() + rOld2.getZ()) * 0.5);
-        return aAvg;
+        return B3DTuple(
+            rOld1.getX() == rOld2.getX() ? rOld1.getX() : (rOld1.getX() + rOld2.getX()) * 0.5,
+            rOld1.getY() == rOld2.getY() ? rOld1.getY() : (rOld1.getY() + rOld2.getY()) * 0.5,
+            rOld1.getZ() == rOld2.getZ() ? rOld1.getZ() : (rOld1.getZ() + rOld2.getZ()) * 0.5);
     }
 
     inline B3DTuple average(const B3DTuple& rOld1, const B3DTuple& rOld2, const B3DTuple& rOld3)
     {
-        B3DTuple aAvg(
-            (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
-            (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0),
-            (rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0));
-        return aAvg;
+        return B3DTuple(
+            (rOld1.getX() == rOld2.getX() && rOld2.getX() == rOld3.getX()) ? rOld1.getX() : (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
+            (rOld1.getY() == rOld2.getY() && rOld2.getY() == rOld3.getY()) ? rOld1.getY() : (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0),
+            (rOld1.getZ() == rOld2.getZ() && rOld2.getZ() == rOld3.getZ()) ? rOld1.getZ() : (rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0));
     }
 
     inline B3DTuple operator+(const B3DTuple& rTupA, const B3DTuple& rTupB)
diff --git a/include/basegfx/tuple/b3i64tuple.hxx b/include/basegfx/tuple/b3i64tuple.hxx
index bcc1aca..9e35876 100644
--- a/include/basegfx/tuple/b3i64tuple.hxx
+++ b/include/basegfx/tuple/b3i64tuple.hxx
@@ -221,20 +221,18 @@ namespace basegfx
 
     inline B3I64Tuple minimum(const B3I64Tuple& rTupA, const B3I64Tuple& rTupB)
     {
-        B3I64Tuple aMin(
-            (rTupB.getX() < rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() < rTupA.getY()) ? rTupB.getY() : rTupA.getY(),
-            (rTupB.getZ() < rTupA.getZ()) ? rTupB.getZ() : rTupA.getZ());
-        return aMin;
+        return B3I64Tuple(
+            std::min(rTupB.getX(), rTupA.getX()),
+            std::min(rTupB.getY(), rTupA.getY()),
+            std::min(rTupB.getZ(), rTupA.getZ()));
     }
 
     inline B3I64Tuple maximum(const B3I64Tuple& rTupA, const B3I64Tuple& rTupB)
     {
-        B3I64Tuple aMax(
-            (rTupB.getX() > rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() > rTupA.getY()) ? rTupB.getY() : rTupA.getY(),
-            (rTupB.getZ() > rTupA.getZ()) ? rTupB.getZ() : rTupA.getZ());
-        return aMax;
+        return B3I64Tuple(
+            std::max(rTupB.getX(), rTupA.getX()),
+            std::max(rTupB.getY(), rTupA.getY()),
+            std::max(rTupB.getZ(), rTupA.getZ()));
     }
 
     inline B3I64Tuple absolute(const B3I64Tuple& rTup)
@@ -246,31 +244,43 @@ namespace basegfx
         return aAbs;
     }
 
-    inline B3DTuple interpolate(const B3I64Tuple& rOld1, const B3I64Tuple& rOld2, double t)
+    inline B3I64Tuple interpolate(const B3I64Tuple& rOld1, const B3I64Tuple& rOld2, double t)
     {
-        B3DTuple aInt(
-            ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
-            ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY(),
-            ((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ());
-        return aInt;
+        if(rOld1 == rOld2)
+        {
+            return rOld1;
+        }
+        else if(0.0 >= t)
+        {
+            return rOld1;
+        }
+        else if(1.0 <= t)
+        {
+            return rOld2;
+        }
+        else
+        {
+            return B3I64Tuple(
+                basegfx::fround64(((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX()),
+                basegfx::fround64(((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY()),
+                basegfx::fround64(((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ()));
+        }
     }
 
-    inline B3DTuple average(const B3I64Tuple& rOld1, const B3I64Tuple& rOld2)
+    inline B3I64Tuple average(const B3I64Tuple& rOld1, const B3I64Tuple& rOld2)
     {
-        B3DTuple aAvg(
-            (rOld1.getX() + rOld2.getX()) * 0.5,
-            (rOld1.getY() + rOld2.getY()) * 0.5,
-            (rOld1.getZ() + rOld2.getZ()) * 0.5);
-        return aAvg;
+        return B3I64Tuple(
+            rOld1.getX() == rOld2.getX() ? rOld1.getX() : basegfx::fround64((rOld1.getX() + rOld2.getX()) * 0.5),
+            rOld1.getY() == rOld2.getY() ? rOld1.getY() : basegfx::fround64((rOld1.getY() + rOld2.getY()) * 0.5),
+            rOld1.getZ() == rOld2.getZ() ? rOld1.getZ() : basegfx::fround64((rOld1.getZ() + rOld2.getZ()) * 0.5));
     }
 
-    inline B3DTuple average(const B3I64Tuple& rOld1, const B3I64Tuple& rOld2, const B3I64Tuple& rOld3)
+    inline B3I64Tuple average(const B3I64Tuple& rOld1, const B3I64Tuple& rOld2, const B3I64Tuple& rOld3)
     {
-        B3DTuple aAvg(
-            (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
-            (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0),
-            (rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0));
-        return aAvg;
+        return B3I64Tuple(
+            (rOld1.getX() == rOld2.getX() && rOld2.getX() == rOld3.getX()) ? rOld1.getX() : basegfx::fround64((rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0)),
+            (rOld1.getY() == rOld2.getY() && rOld2.getY() == rOld3.getY()) ? rOld1.getY() : basegfx::fround64((rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0)),
+            (rOld1.getZ() == rOld2.getZ() && rOld2.getZ() == rOld3.getZ()) ? rOld1.getZ() : basegfx::fround64((rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0)));
     }
 
     inline B3I64Tuple operator+(const B3I64Tuple& rTupA, const B3I64Tuple& rTupB)
diff --git a/include/basegfx/tuple/b3ituple.hxx b/include/basegfx/tuple/b3ituple.hxx
index 49fb246..ad4d8d3 100644
--- a/include/basegfx/tuple/b3ituple.hxx
+++ b/include/basegfx/tuple/b3ituple.hxx
@@ -220,20 +220,18 @@ namespace basegfx
 
     inline B3ITuple minimum(const B3ITuple& rTupA, const B3ITuple& rTupB)
     {
-        B3ITuple aMin(
-            (rTupB.getX() < rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() < rTupA.getY()) ? rTupB.getY() : rTupA.getY(),
-            (rTupB.getZ() < rTupA.getZ()) ? rTupB.getZ() : rTupA.getZ());
-        return aMin;
+        return B3ITuple(
+            std::min(rTupB.getX(), rTupA.getX()),
+            std::min(rTupB.getY(), rTupA.getY()),
+            std::min(rTupB.getZ(), rTupA.getZ()));
     }
 
     inline B3ITuple maximum(const B3ITuple& rTupA, const B3ITuple& rTupB)
     {
-        B3ITuple aMax(
-            (rTupB.getX() > rTupA.getX()) ? rTupB.getX() : rTupA.getX(),
-            (rTupB.getY() > rTupA.getY()) ? rTupB.getY() : rTupA.getY(),
-            (rTupB.getZ() > rTupA.getZ()) ? rTupB.getZ() : rTupA.getZ());
-        return aMax;
+        return B3ITuple(
+            std::max(rTupB.getX(), rTupA.getX()),
+            std::max(rTupB.getY(), rTupA.getY()),
+            std::max(rTupB.getZ(), rTupA.getZ()));
     }
 
     inline B3ITuple absolute(const B3ITuple& rTup)
@@ -245,31 +243,43 @@ namespace basegfx
         return aAbs;
     }
 
-    inline B3DTuple interpolate(const B3ITuple& rOld1, const B3ITuple& rOld2, double t)
+    inline B3ITuple interpolate(const B3ITuple& rOld1, const B3ITuple& rOld2, double t)
     {
-        B3DTuple aInt(
-            ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
-            ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY(),
-            ((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ());
-        return aInt;
+        if(rOld1 == rOld2)
+        {
+            return rOld1;
+        }
+        else if(0.0 >= t)
+        {
+            return rOld1;
+        }
+        else if(1.0 <= t)
+        {
+            return rOld2;
+        }
+        else
+        {
+            return B3ITuple(
+                basegfx::fround(((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX()),
+                basegfx::fround(((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY()),
+                basegfx::fround(((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ()));
+        }
     }
 
-    inline B3DTuple average(const B3ITuple& rOld1, const B3ITuple& rOld2)
+    inline B3ITuple average(const B3ITuple& rOld1, const B3ITuple& rOld2)
     {
-        B3DTuple aAvg(
-            (rOld1.getX() + rOld2.getX()) * 0.5,
-            (rOld1.getY() + rOld2.getY()) * 0.5,
-            (rOld1.getZ() + rOld2.getZ()) * 0.5);
-        return aAvg;
+        return B3ITuple(
+            rOld1.getX() == rOld2.getX() ? rOld1.getX() : basegfx::fround((rOld1.getX() + rOld2.getX()) * 0.5),
+            rOld1.getY() == rOld2.getY() ? rOld1.getY() : basegfx::fround((rOld1.getY() + rOld2.getY()) * 0.5),
+            rOld1.getZ() == rOld2.getZ() ? rOld1.getZ() : basegfx::fround((rOld1.getZ() + rOld2.getZ()) * 0.5));
     }
 
-    inline B3DTuple average(const B3ITuple& rOld1, const B3ITuple& rOld2, const B3ITuple& rOld3)
+    inline B3ITuple average(const B3ITuple& rOld1, const B3ITuple& rOld2, const B3ITuple& rOld3)
     {
-        B3DTuple aAvg(
-            (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
-            (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0),
-            (rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0));
-        return aAvg;
+        return B3ITuple(
+            (rOld1.getX() == rOld2.getX() && rOld2.getX() == rOld3.getX()) ? rOld1.getX() : basegfx::fround((rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0)),
+            (rOld1.getY() == rOld2.getY() && rOld2.getY() == rOld3.getY()) ? rOld1.getX() : basegfx::fround((rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0)),
+            (rOld1.getZ() == rOld2.getZ() && rOld2.getZ() == rOld3.getZ()) ? rOld1.getX() : basegfx::fround((rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0)));
     }
 
     inline B3ITuple operator+(const B3ITuple& rTupA, const B3ITuple& rTupB)
commit 5e39bc0937940e8d0f78668366e9de447269f0df
Author: Armin Le Grand <alg at apache.org>
Date:   Tue Oct 2 11:08:18 2012 +0000

    Related: #i120604# Adapted back texture mapper for gradients for 3D usage
    
    (cherry picked from commit 4152ce982bc8c1aca6859d9b803cefd16ba11de0)
    
    Change-Id: I712494bb166518c2ba9aa2ef529b4ac3e9fe8951

diff --git a/basegfx/source/tools/gradienttools.cxx b/basegfx/source/tools/gradienttools.cxx
index f3e2540..83b6e21 100644
--- a/basegfx/source/tools/gradienttools.cxx
+++ b/basegfx/source/tools/gradienttools.cxx
@@ -354,42 +354,73 @@ namespace basegfx
         double getLinearGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
         {
             const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
-            const double t(clamp(aCoor.getY(), 0.0, 1.0));
+
+            if(aCoor.getX() < 0.0 || aCoor.getX() > 1.0)
+            {
+                return 0.0;
+            }
+
+            if(aCoor.getY() <= 0.0)
+            {
+                return 0.0;
+            }
+
+            if(aCoor.getY() >= 1.0)
+            {
+                return 1.0;
+            }
+
             const sal_uInt32 nSteps(rGradInfo.getSteps());
 
             if(nSteps)
             {
-                return floor(t * nSteps) / double(nSteps + 1L);
+                return floor(aCoor.getY() * nSteps) / double(nSteps - 1);
             }
 
-            return t;
+            return aCoor.getY();
         }
 
         double getAxialGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
         {
             const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
-            const double t(clamp(fabs(aCoor.getY()), 0.0, 1.0));
+
+            if(aCoor.getX() < 0.0 || aCoor.getX() > 1.0)
+            {
+                return 0.0;
+            }
+
+            const double fAbsY(fabs(aCoor.getY()));
+
+            if(fAbsY >= 1.0)
+            {
+                return 0.0;
+            }
+
             const sal_uInt32 nSteps(rGradInfo.getSteps());
-            const double fInternalSteps((nSteps * 2) - 1);
 
             if(nSteps)
             {
-                return floor(((t * fInternalSteps) + 1.0) / 2.0) / double(nSteps - 1L);
+                return floor(fAbsY * nSteps) / double(nSteps - 1);
             }
 
-            return t;
+            return fAbsY;
         }
 
         double getRadialGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
         {
             const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
-            const double fDist(clamp(aCoor.getX() * aCoor.getX() + aCoor.getY() * aCoor.getY(), 0.0, 1.0));
-            const double t(1.0 - sqrt(fDist));
+
+            if(aCoor.getX() < -1.0 || aCoor.getX() > 1.0 || aCoor.getY() < -1.0 || aCoor.getY() > 1.0)
+            {
+                return 0.0;
+            }
+
+            const double t(1.0 - sqrt(aCoor.getX() * aCoor.getX() + aCoor.getY() * aCoor.getY()));
             const sal_uInt32 nSteps(rGradInfo.getSteps());
 
-            if(nSteps)
+            if(nSteps && t < 1.0)
             {
-                return floor(t * nSteps) / double(nSteps - 1L);
+                return floor(t * nSteps) / double(nSteps - 1);
             }
 
             return t;
@@ -404,9 +435,15 @@ namespace basegfx
         {
             const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
             const double fAbsX(fabs(aCoor.getX()));
+
+            if(fAbsX >= 1.0)
+            {
+                return 0.0;
+            }
+
             const double fAbsY(fabs(aCoor.getY()));
 
-            if(fTools::moreOrEqual(fAbsX, 1.0) || fTools::moreOrEqual(fAbsY, 1.0))
+            if(fAbsY >= 1.0)
             {
                 return 0.0;
             }
@@ -414,9 +451,9 @@ namespace basegfx
             const double t(1.0 - std::max(fAbsX, fAbsY));
             const sal_uInt32 nSteps(rGradInfo.getSteps());
 
-            if(nSteps)
+            if(nSteps && t < 1.0)
             {
-                return floor(t * nSteps) / double(nSteps - 1L);
+                return floor(t * nSteps) / double(nSteps - 1);
             }
 
             return t;
commit 385bb4547359027bca6d5158e00e541f094b277e
Author: Armin Le Grand <alg at apache.org>
Date:   Tue Oct 2 08:23:25 2012 +0000

    Resolves: #i120604# unified and secured gradient tooling for primitives
    
    (cherry picked from commit 05785d283e718aab182a5ea848de72e4a4b2efe3)
    
    Conflicts:
    	basegfx/inc/basegfx/tools/gradienttools.hxx
    	basegfx/source/tools/gradienttools.cxx
    	cppcanvas/source/mtfrenderer/implrenderer.cxx
    	drawinglayer/inc/drawinglayer/primitive2d/fillgradientprimitive2d.hxx
    	drawinglayer/inc/drawinglayer/texture/texture.hxx
    	drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
    	drawinglayer/source/processor2d/vclhelpergradient.cxx
    
    Change-Id: I21f94e7b4eede094171a83a009ae19213e77f22c
    
    Unname unused argument to prevent warnings.
    
    (cherry picked from commit f7d4af835cf308bc9ece6fd84cbd14ba5be0adcd)
    
    Change-Id: I44381f1e417c39dfbd1d4051079bbd09f0c61848

diff --git a/basegfx/source/tools/gradienttools.cxx b/basegfx/source/tools/gradienttools.cxx
index 7bdc07d..f3e2540 100644
--- a/basegfx/source/tools/gradienttools.cxx
+++ b/basegfx/source/tools/gradienttools.cxx
@@ -24,19 +24,35 @@
 
 namespace basegfx
 {
+    bool ODFGradientInfo::operator==(const ODFGradientInfo& rODFGradientInfo) const
+    {
+        return getTextureTransform() == rODFGradientInfo.getTextureTransform()
+            && getAspectRatio() == rODFGradientInfo.getAspectRatio()
+            && getSteps() == rODFGradientInfo.getSteps();
+    }
+
+    const B2DHomMatrix& ODFGradientInfo::getBackTextureTransform() const
+    {
+        if(maBackTextureTransform.isIdentity())
+        {
+            const_cast< ODFGradientInfo* >(this)->maBackTextureTransform = getTextureTransform();
+            const_cast< ODFGradientInfo* >(this)->maBackTextureTransform.invert();
+        }
+
+        return maBackTextureTransform;
+    }
+
     /** Most of the setup for linear & axial gradient is the same, except
         for the border treatment. Factored out here.
     */
-    static void init1DGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                   const B2DRange&  rTargetRange,
-                                   sal_uInt32       nSteps,
-                                   double           fBorder,
-                                   double           fAngle,
-                                   bool             bAxial)
+    ODFGradientInfo init1DGradientInfo(
+        const B2DRange& rTargetRange,
+        sal_uInt32 nSteps,
+        double fBorder,
+        double fAngle,
+        bool bAxial)
     {
-        o_rGradientInfo.maTextureTransform.identity();
-        o_rGradientInfo.maBackTextureTransform.identity();
-        o_rGradientInfo.mnSteps = nSteps;
+        B2DHomMatrix aTextureTransform;
 
         fAngle = -fAngle;
 
@@ -46,69 +62,68 @@ namespace basegfx
         double fTargetOffsetY(rTargetRange.getMinY());
 
         // add object expansion
-        if(0.0 != fAngle)
+        const bool bAngleUsed(!fTools::equalZero(fAngle));
+
+        if(bAngleUsed)
         {
             const double fAbsCos(fabs(cos(fAngle)));
             const double fAbsSin(fabs(sin(fAngle)));
             const double fNewX(fTargetSizeX * fAbsCos + fTargetSizeY * fAbsSin);
             const double fNewY(fTargetSizeY * fAbsCos + fTargetSizeX * fAbsSin);
+
             fTargetOffsetX -= (fNewX - fTargetSizeX) / 2.0;
             fTargetOffsetY -= (fNewY - fTargetSizeY) / 2.0;
             fTargetSizeX = fNewX;
             fTargetSizeY = fNewY;
         }
 
-        const double fSizeWithoutBorder=1.0 - fBorder;
-        if( bAxial )
+        const double fSizeWithoutBorder(1.0 - fBorder);
+
+        if(bAxial)
         {
-            o_rGradientInfo.maTextureTransform.scale(1.0, fSizeWithoutBorder * .5);
-            o_rGradientInfo.maTextureTransform.translate(0.0, 0.5);
+            aTextureTransform.scale(1.0, fSizeWithoutBorder * 0.5);
+            aTextureTransform.translate(0.0, 0.5);
         }
         else
         {
             if(!fTools::equal(fSizeWithoutBorder, 1.0))
             {
-                o_rGradientInfo.maTextureTransform.scale(1.0, fSizeWithoutBorder);
-                o_rGradientInfo.maTextureTransform.translate(0.0, fBorder);
+                aTextureTransform.scale(1.0, fSizeWithoutBorder);
+                aTextureTransform.translate(0.0, fBorder);
             }
         }
 
-        o_rGradientInfo.maTextureTransform.scale(fTargetSizeX, fTargetSizeY);
+        aTextureTransform.scale(fTargetSizeX, fTargetSizeY);
 
         // add texture rotate after scale to keep perpendicular angles
-        if(0.0 != fAngle)
+        if(bAngleUsed)
         {
-            const B2DPoint aCenter(0.5*fTargetSizeX,
-                                   0.5*fTargetSizeY);
-            o_rGradientInfo.maTextureTransform *=
-                basegfx::tools::createRotateAroundPoint(aCenter, fAngle);
+            const B2DPoint aCenter(0.5 * fTargetSizeX, 0.5 * fTargetSizeY);
+
+            aTextureTransform *= basegfx::tools::createRotateAroundPoint(aCenter, fAngle);
         }
 
         // add object translate
-        o_rGradientInfo.maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY);
+        aTextureTransform.translate(fTargetOffsetX, fTargetOffsetY);
 
         // prepare aspect for texture
-        o_rGradientInfo.mfAspectRatio = (0.0 != fTargetSizeY) ?  fTargetSizeX / fTargetSizeY : 1.0;
+        const double fAspectRatio(fTools::equalZero(fTargetSizeY) ?  1.0 : fTargetSizeX / fTargetSizeY);
 
-        // build transform from u,v to [0.0 .. 1.0].
-        o_rGradientInfo.maBackTextureTransform = o_rGradientInfo.maTextureTransform;
-        o_rGradientInfo.maBackTextureTransform.invert();
+        return ODFGradientInfo(aTextureTransform, fAspectRatio, nSteps);
     }
 
     /** Most of the setup for radial & ellipsoidal gradient is the same,
         except for the border treatment. Factored out here.
     */
-    static void initEllipticalGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                           const B2DRange&  rTargetRange,
-                                           const B2DVector& rOffset,
-                                           sal_uInt32       nSteps,
-                                           double           fBorder,
-                                           double           fAngle,
-                                           bool             bCircular)
+    ODFGradientInfo initEllipticalGradientInfo(
+        const B2DRange& rTargetRange,
+        const B2DVector& rOffset,
+        sal_uInt32 nSteps,
+        double fBorder,
+        double fAngle,
+        bool bCircular)
     {
-        o_rGradientInfo.maTextureTransform.identity();
-        o_rGradientInfo.maBackTextureTransform.identity();
-        o_rGradientInfo.mnSteps = nSteps;
+        B2DHomMatrix aTextureTransform;
 
         fAngle = -fAngle;
 
@@ -118,9 +133,10 @@ namespace basegfx
         double fTargetOffsetY(rTargetRange.getMinY());
 
         // add object expansion
-        if( bCircular )
+        if(bCircular)
         {
             const double fOriginalDiag(sqrt((fTargetSizeX * fTargetSizeX) + (fTargetSizeY * fTargetSizeY)));
+
             fTargetOffsetX -= (fOriginalDiag - fTargetSizeX) / 2.0;
             fTargetOffsetY -= (fOriginalDiag - fTargetSizeY) / 2.0;
             fTargetSizeX = fOriginalDiag;
@@ -135,22 +151,21 @@ namespace basegfx
         }
 
         const double fHalfBorder((1.0 - fBorder) * 0.5);
-        o_rGradientInfo.maTextureTransform.scale(fHalfBorder, fHalfBorder);
 
-        o_rGradientInfo.maTextureTransform.translate(0.5, 0.5);
-        o_rGradientInfo.maTextureTransform.scale(fTargetSizeX, fTargetSizeY);
+        aTextureTransform.scale(fHalfBorder, fHalfBorder);
+        aTextureTransform.translate(0.5, 0.5);
+        aTextureTransform.scale(fTargetSizeX, fTargetSizeY);
 
         // add texture rotate after scale to keep perpendicular angles
-        if( !bCircular && 0.0 != fAngle)
+        if(!bCircular && !fTools::equalZero(fAngle))
         {
-            const B2DPoint aCenter(0.5*fTargetSizeX,
-                                   0.5*fTargetSizeY);
-            o_rGradientInfo.maTextureTransform *=
-                basegfx::tools::createRotateAroundPoint(aCenter, fAngle);
+            const B2DPoint aCenter(0.5 * fTargetSizeX, 0.5 * fTargetSizeY);
+
+            aTextureTransform *= basegfx::tools::createRotateAroundPoint(aCenter, fAngle);
         }
 
         // add defined offsets after rotation
-        if(0.5 != rOffset.getX() || 0.5 != rOffset.getY())
+        if(!fTools::equal(0.5, rOffset.getX()) || !fTools::equal(0.5, rOffset.getY()))
         {
             // use original target size
             fTargetOffsetX += (rOffset.getX() - 0.5) * rTargetRange.getWidth();
@@ -158,30 +173,26 @@ namespace basegfx
         }
 
         // add object translate
-        o_rGradientInfo.maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY);
+        aTextureTransform.translate(fTargetOffsetX, fTargetOffsetY);
 
         // prepare aspect for texture
-        o_rGradientInfo.mfAspectRatio = (0.0 != fTargetSizeY) ?  fTargetSizeX / fTargetSizeY : 1.0;
+        const double fAspectRatio((0.0 != fTargetSizeY) ?  fTargetSizeX / fTargetSizeY : 1.0);
 
-        // build transform from u,v to [0.0 .. 1.0].
-        o_rGradientInfo.maBackTextureTransform = o_rGradientInfo.maTextureTransform;
-        o_rGradientInfo.maBackTextureTransform.invert();
+        return ODFGradientInfo(aTextureTransform, fAspectRatio, nSteps);
     }
 
     /** Setup for rect & square gradient is exactly the same. Factored out
         here.
     */
-    static void initRectGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                     const B2DRange&  rTargetRange,
-                                     const B2DVector& rOffset,
-                                     sal_uInt32       nSteps,
-                                     double           fBorder,
-                                     double           fAngle,
-                                     bool             bSquare)
+    ODFGradientInfo initRectGradientInfo(
+        const B2DRange& rTargetRange,
+        const B2DVector& rOffset,
+        sal_uInt32 nSteps,
+        double fBorder,
+        double fAngle,
+        bool bSquare)
     {
-        o_rGradientInfo.maTextureTransform.identity();
-        o_rGradientInfo.maBackTextureTransform.identity();
-        o_rGradientInfo.mnSteps = nSteps;
+        B2DHomMatrix aTextureTransform;
 
         fAngle = -fAngle;
 
@@ -194,18 +205,22 @@ namespace basegfx
         if(bSquare)
         {
             const double fSquareWidth(std::max(fTargetSizeX, fTargetSizeY));
+
             fTargetOffsetX -= (fSquareWidth - fTargetSizeX) / 2.0;
             fTargetOffsetY -= (fSquareWidth - fTargetSizeY) / 2.0;
             fTargetSizeX = fTargetSizeY = fSquareWidth;
         }
 
         // add object expansion
-        if(0.0 != fAngle)
+        const bool bAngleUsed(!fTools::equalZero(fAngle));
+
+        if(bAngleUsed)
         {
             const double fAbsCos(fabs(cos(fAngle)));
             const double fAbsSin(fabs(sin(fAngle)));
             const double fNewX(fTargetSizeX * fAbsCos + fTargetSizeY * fAbsSin);
             const double fNewY(fTargetSizeY * fAbsCos + fTargetSizeX * fAbsSin);
+
             fTargetOffsetX -= (fNewX - fTargetSizeX) / 2.0;
             fTargetOffsetY -= (fNewY - fTargetSizeY) / 2.0;
             fTargetSizeX = fNewX;
@@ -213,22 +228,21 @@ namespace basegfx
         }
 
         const double fHalfBorder((1.0 - fBorder) * 0.5);
-        o_rGradientInfo.maTextureTransform.scale(fHalfBorder, fHalfBorder);
 
-        o_rGradientInfo.maTextureTransform.translate(0.5, 0.5);
-        o_rGradientInfo.maTextureTransform.scale(fTargetSizeX, fTargetSizeY);
+        aTextureTransform.scale(fHalfBorder, fHalfBorder);
+        aTextureTransform.translate(0.5, 0.5);
+        aTextureTransform.scale(fTargetSizeX, fTargetSizeY);
 
         // add texture rotate after scale to keep perpendicular angles
-        if(0.0 != fAngle)
+        if(bAngleUsed)
         {
-            const B2DPoint aCenter(0.5*fTargetSizeX,
-                                   0.5*fTargetSizeY);
-            o_rGradientInfo.maTextureTransform *=
-                basegfx::tools::createRotateAroundPoint(aCenter, fAngle);
+            const B2DPoint aCenter(0.5 * fTargetSizeX, 0.5 * fTargetSizeY);
+
+            aTextureTransform *= basegfx::tools::createRotateAroundPoint(aCenter, fAngle);
         }
 
         // add defined offsets after rotation
-        if(0.5 != rOffset.getX() || 0.5 != rOffset.getY())
+        if(!fTools::equal(0.5, rOffset.getX()) || !fTools::equal(0.5, rOffset.getY()))
         {
             // use scaled target size
             fTargetOffsetX += (rOffset.getX() - 0.5) * fTargetSizeX;
@@ -236,117 +250,183 @@ namespace basegfx
         }
 
         // add object translate
-        o_rGradientInfo.maTextureTransform.translate(fTargetOffsetX, fTargetOffsetY);
+        aTextureTransform.translate(fTargetOffsetX, fTargetOffsetY);
 
         // prepare aspect for texture
-        o_rGradientInfo.mfAspectRatio = (0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0;
+        const double fAspectRatio((0.0 != fTargetSizeY) ? fTargetSizeX / fTargetSizeY : 1.0);
 
-        // build transform from u,v to [0.0 .. 1.0]. As base, use inverse texture transform
-        o_rGradientInfo.maBackTextureTransform = o_rGradientInfo.maTextureTransform;
-        o_rGradientInfo.maBackTextureTransform.invert();
+        return ODFGradientInfo(aTextureTransform, fAspectRatio, nSteps);
     }
 
     namespace tools
     {
-        ODFGradientInfo& createLinearODFGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                                     const B2DRange&  rTargetArea,
-                                                     sal_uInt32       nSteps,
-                                                     double           fBorder,
-                                                     double           fAngle)
+        ODFGradientInfo createLinearODFGradientInfo(
+            const B2DRange& rTargetArea,
+            sal_uInt32 nSteps,
+            double fBorder,
+            double fAngle)
         {
-            init1DGradientInfo(o_rGradientInfo,
-                               rTargetArea,
-                               nSteps,
-                               fBorder,
-                               fAngle,
-                               false);
-            return o_rGradientInfo;
+            return init1DGradientInfo(
+                rTargetArea,
+                nSteps,
+                fBorder,
+                fAngle,
+                false);
         }
 
-        ODFGradientInfo& createAxialODFGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                                    const B2DRange&  rTargetArea,
-                                                    sal_uInt32       nSteps,
-                                                    double           fBorder,
-                                                    double           fAngle)
+        ODFGradientInfo createAxialODFGradientInfo(
+            const B2DRange& rTargetArea,
+            sal_uInt32 nSteps,
+            double fBorder,
+            double fAngle)
         {
-            init1DGradientInfo(o_rGradientInfo,
-                               rTargetArea,
-                               nSteps,
-                               fBorder,
-                               fAngle,
-                               true);
-            return o_rGradientInfo;
+            return init1DGradientInfo(
+                rTargetArea,
+                nSteps,
+                fBorder,
+                fAngle,
+                true);
         }
 
-        ODFGradientInfo& createRadialODFGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                                     const B2DRange&  rTargetArea,
-                                                     const B2DVector& rOffset,
-                                                     sal_uInt32       nSteps,
-                                                     double           fBorder)
+        ODFGradientInfo createRadialODFGradientInfo(
+            const B2DRange& rTargetArea,
+            const B2DVector& rOffset,
+            sal_uInt32 nSteps,
+            double fBorder)
         {
-            initEllipticalGradientInfo(o_rGradientInfo,
-                                       rTargetArea,
-                                       rOffset,
-                                       nSteps,
-                                       fBorder,
-                                       0.0,
-                                       true);
-            return o_rGradientInfo;
+            return initEllipticalGradientInfo(
+                rTargetArea,
+                rOffset,
+                nSteps,
+                fBorder,
+                0.0,
+                true);
         }
 
-        ODFGradientInfo& createEllipticalODFGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                                         const B2DRange&  rTargetArea,
-                                                         const B2DVector& rOffset,
-                                                         sal_uInt32       nSteps,
-                                                         double           fBorder,
-                                                         double           fAngle)
+        ODFGradientInfo createEllipticalODFGradientInfo(
+            const B2DRange& rTargetArea,
+            const B2DVector& rOffset,
+            sal_uInt32 nSteps,
+            double fBorder,
+            double fAngle)
         {
-            initEllipticalGradientInfo(o_rGradientInfo,
-                                       rTargetArea,
-                                       rOffset,
-                                       nSteps,
-                                       fBorder,
-                                       fAngle,
-                                       false);
-            return o_rGradientInfo;
+            return initEllipticalGradientInfo(
+                rTargetArea,
+                rOffset,
+                nSteps,
+                fBorder,
+                fAngle,
+                false);
         }
 
-        ODFGradientInfo& createSquareODFGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                                     const B2DRange&  rTargetArea,
-                                                     const B2DVector& rOffset,
-                                                     sal_uInt32       nSteps,
-                                                     double           fBorder,
-                                                     double           fAngle)
+        ODFGradientInfo createSquareODFGradientInfo(
+            const B2DRange& rTargetArea,
+            const B2DVector& rOffset,
+            sal_uInt32 nSteps,
+            double fBorder,
+            double fAngle)
         {
-            initRectGradientInfo(o_rGradientInfo,
-                                 rTargetArea,
-                                 rOffset,
-                                 nSteps,
-                                 fBorder,
-                                 fAngle,
-                                 true);
-            return o_rGradientInfo;
+            return initRectGradientInfo(
+                rTargetArea,
+                rOffset,
+                nSteps,
+                fBorder,
+                fAngle,
+                true);
         }
 
-        ODFGradientInfo& createRectangularODFGradientInfo(ODFGradientInfo& o_rGradientInfo,
-                                                          const B2DRange&  rTargetArea,
-                                                          const B2DVector& rOffset,
-                                                          sal_uInt32       nSteps,
-                                                          double           fBorder,
-                                                          double           fAngle)
+        ODFGradientInfo createRectangularODFGradientInfo(
+            const B2DRange& rTargetArea,
+            const B2DVector& rOffset,
+            sal_uInt32 nSteps,
+            double fBorder,
+            double fAngle)
         {
-            initRectGradientInfo(o_rGradientInfo,
-                                 rTargetArea,
-                                 rOffset,
-                                 nSteps,
-                                 fBorder,
-                                 fAngle,
-                                 false);
-            return o_rGradientInfo;
+            return initRectGradientInfo(
+                rTargetArea,
+                rOffset,
+                nSteps,
+                fBorder,
+                fAngle,
+                false);
         }
 
-    } // namespace tools
+        double getLinearGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
+        {
+            const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
+            const double t(clamp(aCoor.getY(), 0.0, 1.0));
+            const sal_uInt32 nSteps(rGradInfo.getSteps());
+
+            if(nSteps)
+            {
+                return floor(t * nSteps) / double(nSteps + 1L);
+            }
+
+            return t;
+        }
 
+        double getAxialGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
+        {
+            const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
+            const double t(clamp(fabs(aCoor.getY()), 0.0, 1.0));
+            const sal_uInt32 nSteps(rGradInfo.getSteps());
+            const double fInternalSteps((nSteps * 2) - 1);
+
+            if(nSteps)
+            {
+                return floor(((t * fInternalSteps) + 1.0) / 2.0) / double(nSteps - 1L);
+            }
+
+            return t;
+        }
+
+        double getRadialGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
+        {
+            const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
+            const double fDist(clamp(aCoor.getX() * aCoor.getX() + aCoor.getY() * aCoor.getY(), 0.0, 1.0));
+            const double t(1.0 - sqrt(fDist));
+            const sal_uInt32 nSteps(rGradInfo.getSteps());
+
+            if(nSteps)
+            {
+                return floor(t * nSteps) / double(nSteps - 1L);
+            }
+
+            return t;
+        }
+
+        double getEllipticalGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
+        {
+            return getRadialGradientAlpha(rUV, rGradInfo); // only matrix setup differs
+        }
+
+        double getSquareGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
+        {
+            const B2DPoint aCoor(rGradInfo.getBackTextureTransform() * rUV);
+            const double fAbsX(fabs(aCoor.getX()));
+            const double fAbsY(fabs(aCoor.getY()));
+
+            if(fTools::moreOrEqual(fAbsX, 1.0) || fTools::moreOrEqual(fAbsY, 1.0))
+            {
+                return 0.0;
+            }
+
+            const double t(1.0 - std::max(fAbsX, fAbsY));
+            const sal_uInt32 nSteps(rGradInfo.getSteps());
+
+            if(nSteps)
+            {
+                return floor(t * nSteps) / double(nSteps - 1L);
+            }
+
+            return t;
+        }
+
+        double getRectangularGradientAlpha(const B2DPoint& rUV, const ODFGradientInfo& rGradInfo)
+        {
+            return getSquareGradientAlpha(rUV, rGradInfo); // only matrix setup differs
+        }
+    } // namespace tools
 } // namespace basegfx
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
index 47b98bb..111c1e2 100644
--- a/cppcanvas/source/mtfrenderer/emfplus.cxx
+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx
@@ -1030,20 +1030,20 @@ namespace cppcanvas
                     basegfx::B2DRange aBoundsRectangle (0, 0, 1, 1);
                     if (brush->type == 4) {
                         aGradientService = "LinearGradient";
-                        basegfx::tools::createLinearODFGradientInfo( aGradInfo,
+                        aGradInfo = basegfx::tools::createLinearODFGradientInfo(
                                 aBoundsRectangle,
                                 aStops.getLength(),
                                 0,
-                                0 );
+                                0);
 
                     } else {
                         aGradientService = "EllipticalGradient";
-                        basegfx::tools::createEllipticalODFGradientInfo( aGradInfo,
+                        aGradInfo = basegfx::tools::createEllipticalODFGradientInfo(
                                 aBoundsRectangle,
                                 ::basegfx::B2DVector( 0, 0 ),
                                 aStops.getLength(),
                                 0,
-                                0 );
+                                0);
                     }
 
                     uno::Reference< lang::XMultiServiceFactory > xFactory(
diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx
index 769df3d..85a5cef 100644
--- a/cppcanvas/source/mtfrenderer/implrenderer.cxx
+++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx
@@ -676,14 +676,14 @@ namespace cppcanvas
                     switch( rGradient.GetStyle() )
                     {
                         case GradientStyle_LINEAR:
-                            basegfx::tools::createLinearODFGradientInfo(aGradInfo,
+                            aGradInfo = basegfx::tools::createLinearODFGradientInfo(
                                                                         aBounds,
                                                                         nSteps,
                                                                         fBorder,
                                                                         fRotation);
                             // map ODF to svg gradient orientation - x
                             // instead of y direction
-                            aGradInfo.maTextureTransform = aGradInfo.maTextureTransform * aRot90;
+                            aGradInfo.setTextureTransform(aGradInfo.getTextureTransform() * aRot90);
                             aGradientService = "LinearGradient";
                             break;
 
@@ -702,27 +702,27 @@ namespace cppcanvas
                             // border value, hence the second (left
                             // most 1-...
                             const double fAxialBorder (1-2*(1-fBorder));
-                            basegfx::tools::createAxialODFGradientInfo(aGradInfo,
+                            aGradInfo = basegfx::tools::createAxialODFGradientInfo(
                                                                         aBounds,
                                                                         nSteps,
                                                                         fAxialBorder,
                                                                         fRotation);
                             // map ODF to svg gradient orientation - x
                             // instead of y direction
-                            aGradInfo.maTextureTransform = aGradInfo.maTextureTransform * aRot90;
+                            aGradInfo.setTextureTransform(aGradInfo.getTextureTransform() * aRot90);
 
                             // map ODF axial gradient to 3-stop linear
                             // gradient - shift left by 0.5
                             basegfx::B2DHomMatrix aShift;
-                            aShift.translate(-0.5,0);
-                            aGradInfo.maTextureTransform = aGradInfo.maTextureTransform * aShift;
 
+                            aShift.translate(-0.5,0);
+                            aGradInfo.setTextureTransform(aGradInfo.getTextureTransform() * aShift);
                             aGradientService = "LinearGradient";
                             break;
                         }
 
                         case GradientStyle_RADIAL:
-                            basegfx::tools::createRadialODFGradientInfo(aGradInfo,
+                            aGradInfo = basegfx::tools::createRadialODFGradientInfo(
                                                                         aBounds,
                                                                         aOffset,
                                                                         nSteps,
@@ -731,7 +731,7 @@ namespace cppcanvas
                             break;
 
                         case GradientStyle_ELLIPTICAL:
-                            basegfx::tools::createEllipticalODFGradientInfo(aGradInfo,
+                            aGradInfo = basegfx::tools::createEllipticalODFGradientInfo(
                                                                             aBounds,
                                                                             aOffset,
                                                                             nSteps,
@@ -741,7 +741,7 @@ namespace cppcanvas
                             break;
 
                         case GradientStyle_SQUARE:
-                            basegfx::tools::createSquareODFGradientInfo(aGradInfo,
+                            aGradInfo = basegfx::tools::createSquareODFGradientInfo(
                                                                         aBounds,
                                                                         aOffset,
                                                                         nSteps,
@@ -751,7 +751,7 @@ namespace cppcanvas
                             break;
 
                         case GradientStyle_RECT:
-                            basegfx::tools::createRectangularODFGradientInfo(aGradInfo,
+                            aGradInfo = basegfx::tools::createRectangularODFGradientInfo(
                                                                              aBounds,
                                                                              aOffset,
                                                                              nSteps,
@@ -767,7 +767,7 @@ namespace cppcanvas
                     }
 
                     ::basegfx::unotools::affineMatrixFromHomMatrix( aTexture.AffineTransform,
-                                                                    aGradInfo.maTextureTransform );
+                                                                    aGradInfo.getTextureTransform() );
 
                     uno::Sequence<uno::Any> args(3);
                     beans::PropertyValue aProp;
@@ -778,7 +778,7 @@ namespace cppcanvas
                     aProp.Value <<= aStops;
                     args[1] <<= aProp;
                     aProp.Name = "AspectRatio";
-                    aProp.Value <<= aGradInfo.mfAspectRatio;
+                    aProp.Value <<= aGradInfo.getAspectRatio();
                     args[2] <<= aProp;
 
                     aTexture.Gradient.set(
diff --git a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
index fef92a9..7511082 100644
--- a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
@@ -36,11 +36,10 @@ namespace drawinglayer
     namespace primitive2d
     {
         void FillGradientPrimitive2D::generateMatricesAndColors(
-            std::vector< basegfx::B2DHomMatrix >& rMatrices,
-            std::vector< basegfx::BColor >& rColors) const
+            std::vector< drawinglayer::texture::B2DHomMatrixAndBColor >& rEntries,
+            basegfx::BColor& rOutmostColor) const
         {
-            rMatrices.clear();
-            rColors.clear();
+            rEntries.clear();
 
             // make sure steps is not too high/low
             const basegfx::BColor aStart(getFillGradient().getStartColor());
@@ -70,127 +69,131 @@ namespace drawinglayer
                 case attribute::GRADIENTSTYLE_LINEAR:
                 {
                     texture::GeoTexSvxGradientLinear aGradient(getObjectRange(), aStart, aEnd, nSteps, getFillGradient().getBorder(), getFillGradient().getAngle());
-                    aGradient.appendTransformations(rMatrices);
-                    aGradient.appendColors(rColors);
+                    aGradient.appendTransformationsAndColors(rEntries, rOutmostColor);
                     break;
                 }
                 case attribute::GRADIENTSTYLE_AXIAL:
                 {
                     texture::GeoTexSvxGradientAxial aGradient(getObjectRange(), aStart, aEnd, nSteps, getFillGradient().getBorder(), getFillGradient().getAngle());
-                    aGradient.appendTransformations(rMatrices);
-                    aGradient.appendColors(rColors);
+                    aGradient.appendTransformationsAndColors(rEntries, rOutmostColor);
                     break;
                 }
                 case attribute::GRADIENTSTYLE_RADIAL:
                 {
                     texture::GeoTexSvxGradientRadial aGradient(getObjectRange(), aStart, aEnd, nSteps, getFillGradient().getBorder(), getFillGradient().getOffsetX(), getFillGradient().getOffsetY());
-                    aGradient.appendTransformations(rMatrices);
-                    aGradient.appendColors(rColors);
+                    aGradient.appendTransformationsAndColors(rEntries, rOutmostColor);
                     break;
                 }
                 case attribute::GRADIENTSTYLE_ELLIPTICAL:
                 {
                     texture::GeoTexSvxGradientElliptical aGradient(getObjectRange(), aStart, aEnd, nSteps, getFillGradient().getBorder(), getFillGradient().getOffsetX(), getFillGradient().getOffsetY(), getFillGradient().getAngle());
-                    aGradient.appendTransformations(rMatrices);
-                    aGradient.appendColors(rColors);
+                    aGradient.appendTransformationsAndColors(rEntries, rOutmostColor);
                     break;
                 }
                 case attribute::GRADIENTSTYLE_SQUARE:
                 {
                     texture::GeoTexSvxGradientSquare aGradient(getObjectRange(), aStart, aEnd, nSteps, getFillGradient().getBorder(), getFillGradient().getOffsetX(), getFillGradient().getOffsetY(), getFillGradient().getAngle());
-                    aGradient.appendTransformations(rMatrices);
-                    aGradient.appendColors(rColors);
+                    aGradient.appendTransformationsAndColors(rEntries, rOutmostColor);
                     break;
                 }
                 case attribute::GRADIENTSTYLE_RECT:
                 {
                     texture::GeoTexSvxGradientRect aGradient(getObjectRange(), aStart, aEnd, nSteps, getFillGradient().getBorder(), getFillGradient().getOffsetX(), getFillGradient().getOffsetY(), getFillGradient().getAngle());
-                    aGradient.appendTransformations(rMatrices);
-                    aGradient.appendColors(rColors);
+                    aGradient.appendTransformationsAndColors(rEntries, rOutmostColor);
                     break;
                 }
             }
         }
 
         Primitive2DSequence FillGradientPrimitive2D::createOverlappingFill(
-            const std::vector< basegfx::B2DHomMatrix >& rMatrices,
-            const std::vector< basegfx::BColor >& rColors,
+            const std::vector< drawinglayer::texture::B2DHomMatrixAndBColor >& rEntries,

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list