/// <summary> /// Finds the next position at the edge of a caret unit in /// specified direction. /// </summary> /// <param name="position"> /// Initial text position of an object/character. /// </param> /// <param name="direction"> /// If Forward, this method returns the "caret unit" position following /// the initial position. /// If Backward, this method returns the caret unit" position preceding /// the initial position. /// </param> /// <returns> /// The next caret unit break position in specified direction. /// </returns> /// <exception cref="System.InvalidOperationException"> /// Throws InvalidOperationException if IsValid is false. /// If IsValid returns false, Validate method must be called before /// calling this method. /// </exception> /// <remarks> /// In the context of this method, "caret unit" refers to a group of one /// or more Unicode code points that map to a single rendered glyph. /// /// If position is located between two caret units, this method returns /// a new position located at the opposite edge of the caret unit in /// the indicated direction. /// If position is located within a group of Unicode code points that map /// to a single caret unit, this method returns a new position at /// the indicated edge of the containing caret unit. /// If position is located at the beginning of end of content -- there is /// no content in the indicated direction -- then this method returns /// a position located at the same location as initial position. /// </remarks> internal override ITextPointer GetNextCaretUnitPosition(ITextPointer position, LogicalDirection direction) { FixedTextPointer ftp = Container.VerifyPosition(position); FixedPosition fixedp; if (_GetFixedPosition(ftp, out fixedp)) { DependencyObject element = this.FixedPage.GetElement(fixedp.Node); if (element is Glyphs) { Glyphs g = (Glyphs)element; GlyphRun run = g.ToGlyphRun(); int characterCount = (run.Characters == null) ? 0 : run.Characters.Count; CharacterHit start = (fixedp.Offset == characterCount) ? new CharacterHit(fixedp.Offset - 1, 1) : new CharacterHit(fixedp.Offset, 0); CharacterHit next = (direction == LogicalDirection.Forward) ? run.GetNextCaretCharacterHit(start) : run.GetPreviousCaretCharacterHit(start); if (!start.Equals(next)) { LogicalDirection edge = LogicalDirection.Forward; if (next.TrailingLength > 0) { edge = LogicalDirection.Backward; } int index = next.FirstCharacterIndex + next.TrailingLength; return(_CreateTextPointer(new FixedPosition(fixedp.Node, index), edge)); } } } //default behavior is to simply move textpointer ITextPointer pointer = position.CreatePointer(); pointer.MoveToNextInsertionPosition(direction); return(pointer); }
// Token: 0x06002EE3 RID: 12003 RVA: 0x000D3B5C File Offset: 0x000D1D5C internal override ITextPointer GetNextCaretUnitPosition(ITextPointer position, LogicalDirection direction) { FixedTextPointer ftp = this.Container.VerifyPosition(position); FixedPosition fixedPosition; if (this._GetFixedPosition(ftp, out fixedPosition)) { DependencyObject element = this.FixedPage.GetElement(fixedPosition.Node); if (element is Glyphs) { Glyphs glyphs = (Glyphs)element; GlyphRun glyphRun = glyphs.ToGlyphRun(); int num = (glyphRun.Characters == null) ? 0 : glyphRun.Characters.Count; CharacterHit characterHit = (fixedPosition.Offset == num) ? new CharacterHit(fixedPosition.Offset - 1, 1) : new CharacterHit(fixedPosition.Offset, 0); CharacterHit obj = (direction == LogicalDirection.Forward) ? glyphRun.GetNextCaretCharacterHit(characterHit) : glyphRun.GetPreviousCaretCharacterHit(characterHit); if (!characterHit.Equals(obj)) { LogicalDirection edge = LogicalDirection.Forward; if (obj.TrailingLength > 0) { edge = LogicalDirection.Backward; } int offset = obj.FirstCharacterIndex + obj.TrailingLength; return(this._CreateTextPointer(new FixedPosition(fixedPosition.Node, offset), edge)); } } } ITextPointer textPointer = position.CreatePointer(); textPointer.MoveToNextInsertionPosition(direction); return(textPointer); }
private void Test2() { //Glyph系クラス GlyphRun glyphRun; GlyphRunDrawing glyphRunDrawing; Glyphs glyphs; GlyphTypeface glyphTypeface; FontFamily fontFamily = new FontFamily("Meiryo UI"); var typefaces = fontFamily.GetTypefaces(); Uri myFontUri = null; foreach (var face in typefaces) { face.TryGetGlyphTypeface(out GlyphTypeface gType); myFontUri = gType.FontUri; break; } glyphs = new(); glyphs.FontUri = myFontUri; glyphs.FontRenderingEmSize = 100; //glyphs.StyleSimulations = StyleSimulations.BoldItalicSimulation; glyphs.UnicodeString = "(ゆっくり)"; glyphs.Fill = Brushes.MediumOrchid; //glyphs.BidiLevel = 1; //glyphs.IsSideways = true; GlyphRun gRun = glyphs.ToGlyphRun(); var chars = gRun.Characters; var clustre = gRun.ClusterMap; var box = gRun.ComputeAlignmentBox(); var inkBox = gRun.ComputeInkBoundingBox(); var dfName = gRun.DeviceFontName; var inside = gRun.GetCaretCharacterHitFromDistance(100, out bool isindside); var hit = gRun.GetNextCaretCharacterHit(new System.Windows.Media.TextFormatting.CharacterHit()); var gInd = gRun.GlyphIndices; var gOffset = gRun.GlyphOffsets; var gTypeface = gRun.GlyphTypeface; MyGrid.Children.Add(glyphs); DrawingVisual dv = new(); //dv.Offset = new Vector(0, -100); using (var dc = dv.RenderOpen()) { //dc.DrawRectangle(Brushes.MediumBlue, null, new Rect(0, 0, 500, 500)); //dc.DrawRectangle(Brushes.MediumBlue, null, new Rect(0, 0, box.Width, box.Height)); dc.DrawGlyphRun(Brushes.MediumAquamarine, gRun); } Rect r3 = dv.Drawing.Bounds; Rect r = dv.ContentBounds; Rect r2 = dv.DescendantBounds; var geo = gRun.BuildGeometry(); Rect rectGeo1 = geo.Bounds; Rect rectGeo2 = geo.GetRenderBounds(null); RenderTargetBitmap bitmap = new((int)box.Width, (int)box.Height, 96, 96, PixelFormats.Pbgra32); bitmap.Render(dv); glyphRunDrawing = new(Brushes.MediumAquamarine, gRun); MyGrid.Background = new DrawingBrush(glyphRunDrawing); //Glyphs //FontUri フォント //FontRenderingEmSize フォントサイズみたいなもの //StyleSimulations 太字と斜体の指定 //BidiLevel 文字を並べる向きの指定、0or偶数で左から、奇数で右からになる //ToGlyphRun() GlyphRun作成 //GlyphRun クラス (System.Windows.Media) | Microsoft Docs //https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.glyphrun?view=net-6.0 // 同じ描画スタイルが設定され、サイズ、フォント、およびフォントの書体が同じである一連のグリフを表します。 //GlyphRunDrawingと組み合わせて使う //プロパティ //AdvanceWidths //グリフ インデックスに対応するアドバンス幅を表す Double 値の一覧を取得または設定します。 //BaselineOrigin Point //GlyphRun のベースライン原点を取得または設定します。 //BidiLevel Int32 //GlyphRun の双方向の入れ子レベルを取得または設定します。 //CaretStops bool //GlyphRun を表す Unicode で UTF16 コード ポイント毎にキャレット ストップがあるかどうかを決定する Boolean 値の一覧を取得または設定します。 //Characters List<Char> //GlyphRun の Unicode を表す UTF16 コード ポイントの一覧を取得または設定します。 //ClusterMap List<Uint16> //GlyphRun の文字をグリフ インデックスにマップする UInt16 値の一覧を取得または設定します。 //DeviceFontName string //GlyphRun が最適化される対象の、デバイス固有のフォントを取得または設定します。 //FontRenderingEmSize double //GlyphRun のレンダリングに使用する全角サイズを取得または設定します。 //GlyphIndices list<Uint16> //描画物理フォントのグリフ インデックスを表す UInt16 値の配列を取得または設定します。 //GlyphOffsets List<point> //GlyphRun のグリフのオフセットを表す Point 値の配列を取得または設定します。 //GlyphTypeface GlyphTypeface //GlyphTypeface の GlyphRun を取得または設定します。 //IsHitTestable bool //GlyphRun 内に有効なキャレット文字ヒットがあるかどうかを示す値を取得します。 //IsSideways bool //グリフを回転するかどうかを示す値を取得または設定します。 //Language XmlLanguage //XmlLanguage の GlyphRun を取得または設定します。 //PixelsPerDip Single //テキストを表示する PixelsPerDip を取得または設定します。 //メソッド //BuildGeometry // GlyphRunのジオメトリを取得します。 //ComputeAlignmentBox Rect // GlyphRunの配置ボックスを取得します。 //ComputeInkBoundingBox Rect // GlyphRunのインク境界ボックスを取得します。 //GetCaretCharacterHitFromDistance(Double, Boolean) CharacterHitグリフラン内でヒットした文字に関する情報を表します。 // GlyphRunのキャレットの文字ヒットを表すCharacterHit値を取得します。 //GetDistanceFromCaretCharacterHit(CharacterHit) double // GlyphRunの前縁から、指定された文字ヒットを含むキャレットストップの前縁または後縁までのオフセットを取得します。 //GetNextCaretCharacterHit(CharacterHit) CharacterHit // GlyphRunで論理方向にヒットした次の有効なキャレット文字を取得します。 //GetPreviousCaretCharacterHit(CharacterHit) CharacterHit // GlyphRunで論理方向にヒットした前の有効なキャレット文字を取得します。 }