[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