summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDiederik van Lierop <mailat-signdiedenrezidotnl>2009-12-28 12:31:56 +0000
committerDiederik van Lierop <mailat-signdiedenrezidotnl>2009-12-28 12:31:56 +0000
commite0c785a92bb64e7d99cf239476e5cd1902a25873 (patch)
treeea4d16f27fceaf8d96ca54644f105e56ba7797c7 /src
parentpatches for LP bug 461964, latitude hiding formula and comment 13. (diff)
downloadinkscape-e0c785a92bb64e7d99cf239476e5cd1902a25873.tar.gz
inkscape-e0c785a92bb64e7d99cf239476e5cd1902a25873.zip
Use correct text anchor for vertical text and when aligning or distributing
(bzr r8857.1.5)
Diffstat (limited to 'src')
-rw-r--r--src/libnrtype/Layout-TNG-OutIter.cpp8
-rw-r--r--src/ui/dialog/align-and-distribute.cpp31
2 files changed, 24 insertions, 15 deletions
diff --git a/src/libnrtype/Layout-TNG-OutIter.cpp b/src/libnrtype/Layout-TNG-OutIter.cpp
index f4e8e4031..0682e3570 100644
--- a/src/libnrtype/Layout-TNG-OutIter.cpp
+++ b/src/libnrtype/Layout-TNG-OutIter.cpp
@@ -227,7 +227,11 @@ boost::optional<Geom::Point> Layout::baselineAnchorPoint() const
Geom::Point left_pt = this->characterAnchorPoint(pos);
pos.thisEndOfLine();
Geom::Point right_pt = this->characterAnchorPoint(pos);
- Geom::Point mid_pt = (left_pt + right_pt)/2;
+
+ if (this->_blockProgression() == LEFT_TO_RIGHT || this->_blockProgression() == RIGHT_TO_LEFT) {
+ left_pt = Geom::Point(left_pt[Geom::Y], left_pt[Geom::X]);
+ right_pt = Geom::Point(right_pt[Geom::Y], right_pt[Geom::X]);
+ }
switch (this->paragraphAlignment(pos)) {
case LEFT:
@@ -235,7 +239,7 @@ boost::optional<Geom::Point> Layout::baselineAnchorPoint() const
return left_pt;
break;
case CENTER:
- return mid_pt;
+ return (left_pt + right_pt)/2; // middle point
break;
case RIGHT:
return right_pt;
diff --git a/src/ui/dialog/align-and-distribute.cpp b/src/ui/dialog/align-and-distribute.cpp
index 024d4b2f1..2bba0a0f8 100644
--- a/src/ui/dialog/align-and-distribute.cpp
+++ b/src/ui/dialog/align-and-distribute.cpp
@@ -705,14 +705,16 @@ private :
{
if (SP_IS_TEXT (*it) || SP_IS_FLOWTEXT (*it)) {
Inkscape::Text::Layout const *layout = te_get_layout(*it);
- Geom::Point base = layout->characterAnchorPoint(layout->begin()) * sp_item_i2d_affine(*it);
- if (base[Geom::X] < b_min[Geom::X]) b_min[Geom::X] = base[Geom::X];
- if (base[Geom::Y] < b_min[Geom::Y]) b_min[Geom::Y] = base[Geom::Y];
- if (base[Geom::X] > b_max[Geom::X]) b_max[Geom::X] = base[Geom::X];
- if (base[Geom::Y] > b_max[Geom::Y]) b_max[Geom::Y] = base[Geom::Y];
-
- Baselines b (*it, base, _orientation);
- sorted.push_back(b);
+ boost::optional<Geom::Point> pt = layout->baselineAnchorPoint();
+ if (pt) {
+ Geom::Point base = *pt * sp_item_i2d_affine(*it);
+ if (base[Geom::X] < b_min[Geom::X]) b_min[Geom::X] = base[Geom::X];
+ if (base[Geom::Y] < b_min[Geom::Y]) b_min[Geom::Y] = base[Geom::Y];
+ if (base[Geom::X] > b_max[Geom::X]) b_max[Geom::X] = base[Geom::X];
+ if (base[Geom::Y] > b_max[Geom::Y]) b_max[Geom::Y] = base[Geom::Y];
+ Baselines b (*it, base, _orientation);
+ sorted.push_back(b);
+ }
}
}
@@ -746,11 +748,14 @@ private :
{
if (SP_IS_TEXT (*it) || SP_IS_FLOWTEXT (*it)) {
Inkscape::Text::Layout const *layout = te_get_layout(*it);
- Geom::Point base = layout->characterAnchorPoint(layout->begin()) * sp_item_i2d_affine(*it);
- Geom::Point t(0.0, 0.0);
- t[_orientation] = b_min[_orientation] - base[_orientation];
- sp_item_move_rel(*it, Geom::Translate(t));
- changed = true;
+ boost::optional<Geom::Point> pt = layout->baselineAnchorPoint();
+ if (pt) {
+ Geom::Point base = *pt * sp_item_i2d_affine(*it);
+ Geom::Point t(0.0, 0.0);
+ t[_orientation] = b_min[_orientation] - base[_orientation];
+ sp_item_move_rel(*it, Geom::Translate(t));
+ changed = true;
+ }
}
}