| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- //
- // System.Drawing.Test.LineLayout.jvm.cs
- //
- // Author:
- // Konstantin Triger <[email protected]>
- //
- // 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
- }
- }
|