diff options
Diffstat (limited to 'mcs/class/System.Drawing/System.Drawing.Text/LineLayout.jvm.cs')
-rwxr-xr-x | mcs/class/System.Drawing/System.Drawing.Text/LineLayout.jvm.cs | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/mcs/class/System.Drawing/System.Drawing.Text/LineLayout.jvm.cs b/mcs/class/System.Drawing/System.Drawing.Text/LineLayout.jvm.cs new file mode 100755 index 00000000000..4771f028751 --- /dev/null +++ b/mcs/class/System.Drawing/System.Drawing.Text/LineLayout.jvm.cs @@ -0,0 +1,187 @@ +// +// System.Drawing.Test.LineLayout.jvm.cs +// +// Author: +// Konstantin Triger <kostat@mainsoft.com> +// +// Copyright (C) 2005 Mainsoft Corporation, (http://www.mainsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Drawing.Drawing2D; + +using font = java.awt.font;
+using text = java.text; +using awt = java.awt;
+using geom = java.awt.geom; + +namespace System.Drawing.Text { + + internal sealed class LineLayout { + + #region Fields + + readonly font.TextLayout _layout; + + readonly float _accumulatedHeight; + readonly TextLineIterator _lineIter; + + #endregion + + #region ctor + + internal LineLayout(font.TextLayout layout, + TextLineIterator lineIter, + float accumulatedHeight) { + + _layout = layout; + _lineIter = lineIter; + _accumulatedHeight = accumulatedHeight; + } + + #endregion + + #region Properties + + internal float AccumulatedHeight { + get { return _accumulatedHeight; } + } + + internal float MeasureWidth {
+ get {
+ return Width + (_lineIter.Margin*2);
+ }
+ }
+ + internal int CharacterCount { + get { return _layout.getCharacterCount(); } + } + + internal float Ascent { + get { return _layout.getAscent(); } + } + + internal float Descent { + get { return _layout.getDescent(); } + } + + public float Leading { + get { return _layout.getLeading(); } + }
+
+ internal float NativeY {
+ get {
+ if (_lineIter.Format.IsVertical) {
+ float height = _lineIter.Height;
+ if (float.IsPositiveInfinity(height))
+ height = 0;
+ switch (_lineIter.Format.Alignment) {
+ case StringAlignment.Center:
+ return (height - Width) / 2;
+ case StringAlignment.Far:
+ return height - _layout.getVisibleAdvance() - _lineIter.Margin;
+ default:
+ return _lineIter.Margin;
+ }
+ }
+ else
+ return AccumulatedHeight + Ascent;
+ }
+ }
+
+ internal float NativeX {
+ get {
+ float width = _lineIter.Width;
+ if (float.IsPositiveInfinity(width))
+ width = 0;
+ if (_lineIter.Format.IsVertical)
+ return (_lineIter.Format.IsRightToLeft) ?
+ width - AccumulatedHeight - Ascent :
+ AccumulatedHeight + Leading + Descent;
+ else {
+ float xOffset;
+ switch ( _lineIter.Format.Alignment) {
+ case StringAlignment.Center:
+ xOffset = (width - Width) / 2;
+ break;
+ case StringAlignment.Far:
+ if (_lineIter.Format.IsRightToLeft)
+ xOffset = _lineIter.Margin;
+ else
+ xOffset = width - _layout.getVisibleAdvance() - _lineIter.Margin;
+ break;
+ default:
+ if (_lineIter.Format.IsRightToLeft)
+ xOffset = width - _layout.getVisibleAdvance() - _lineIter.Margin;
+ else
+ xOffset = _lineIter.Margin;
+ break;
+ }
+
+ return xOffset;
+ }
+ }
+ } + + internal float Height {
+ get {
+ return Ascent + Descent + Leading;
+ }
+ }
+
+ internal float Width {
+ get { + if (_lineIter.Format.MeasureTrailingSpaces) + if (!(_lineIter.Format.IsRightToLeft ^ + (_lineIter.Format.Alignment == StringAlignment.Far))) + return _layout.getAdvance(); + + return _layout.getVisibleAdvance(); + } + } + + #endregion + + #region Methods + + internal void Draw(awt.Graphics2D g2d, float x, float y) {
+ if (_lineIter.Format.IsVertical)
+ _layout.draw(g2d, y + NativeY, -(x + NativeX) );
+ else
+ _layout.draw(g2d, x + NativeX, y + NativeY );
+ } + + internal awt.Shape GetOutline(float x, float y) {
+ geom.AffineTransform t = (geom.AffineTransform)_lineIter.Transform.clone();
+
+ if (_lineIter.Format.IsVertical)
+ t.translate(y + NativeY, -(x + NativeX));
+ else
+ t.translate(x + NativeX, y + NativeY);
+
+ return _layout.getOutline(t);
+ } + + #endregion + } + +}
\ No newline at end of file |