• R/O
  • HTTP
  • SSH
  • HTTPS

CsWin10Desktop3: Commit

Visual C# 7.0, Windows10 Desktop App


Commit MetaInfo

Revision3387c750d5c18a47d3a111f6b3f3ffb5571903b3 (tree)
Time2017-09-16 22:32:15
Authorくまかみ工房 <kumakamikoubou@gmai...>
Commiterくまかみ工房

Log Message

縁取りTextRenderer クラスを追加。

Change Summary

Incremental Difference

--- a/FDK/FDK.csproj
+++ b/FDK/FDK.csproj
@@ -143,6 +143,7 @@
143143 <Compile Include="メディア\画像.cs" />
144144 <Compile Include="メディア\画像フォント.cs" />
145145 <Compile Include="メディア\矩形リスト.cs" />
146+ <Compile Include="メディア\縁取りTextRenderer.cs" />
146147 <Compile Include="入力\IInputDevice.cs" />
147148 <Compile Include="入力\InputDeviceType.cs" />
148149 <Compile Include="入力\InputEvent.cs" />
--- /dev/null
+++ b/FDK/メディア/縁取りTextRenderer.cs
@@ -0,0 +1,87 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Diagnostics;
4+using System.Linq;
5+using SharpDX;
6+using SharpDX.Direct2D1;
7+using SharpDX.DirectWrite;
8+using SharpDX.Mathematics.Interop;
9+
10+namespace FDK.メディア
11+{
12+ /// <summary>
13+ /// 文字列を好きなサイズで縁取りできるカスタムテキストレンダラー。
14+ /// <see cref="SharpDX.DirectWrite.TextLayout"/>.Draw() の引数に渡して使う。
15+ /// </summary>
16+ public class 縁取りTextRenderer : TextRendererBase
17+ {
18+ public 縁取りTextRenderer( SharpDX.Direct2D1.Factory d2dFactory, RenderTarget renderTarget, Brush 輪郭ブラシ, Brush 塗りつぶしブラシ, float 輪郭の太さ = 1.0f )
19+ {
20+ this._d2dFactory = d2dFactory;
21+ this._renderTarget = renderTarget;
22+ this._輪郭ブラシ = 輪郭ブラシ;
23+ this._塗りつぶしブラシ = 塗りつぶしブラシ;
24+ this._輪郭の太さ = 輪郭の太さ;
25+ }
26+
27+ protected override void Dispose( bool disposing )
28+ {
29+ if( disposing )
30+ {
31+ // コンストラクタで受け取ったこれらのオブジェクトは、呼び出し元で解放すること。(参照カウンタをAddしてないので)
32+ //FDKUtilities.解放する( ref this._塗りつぶしブラシ );
33+ //FDKUtilities.解放する( ref this._輪郭ブラシ );
34+ //FDKUtilities.解放する( ref this._renderTarget );
35+ //FDKUtilities.解放する( ref this._d2dFactory );
36+ }
37+ }
38+
39+ public override Result DrawGlyphRun( object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, GlyphRun glyphRun, GlyphRunDescription glyphRunDescription, ComObject clientDrawingEffect )
40+ {
41+ using( var パスジオメトリ = new PathGeometry( this._d2dFactory ) )
42+ {
43+ using( var sink = パスジオメトリ.Open() )
44+ {
45+ glyphRun.FontFace.GetGlyphRunOutline(
46+ glyphRun.FontSize,
47+ glyphRun.Indices,
48+ glyphRun.Advances,
49+ glyphRun.Offsets,
50+ glyphRun.IsSideways,
51+ ( 1 == ( glyphRun.BidiLevel % 2 ) ), // 奇数ならtrue
52+ sink );
53+
54+ sink.Close();
55+ }
56+
57+ // グリフ実行の原点を、適切なベースラインの原点からレンダリングされるように移動する行列。
58+ var matrix = new Matrix3x2(
59+ 1.0f, 0.0f,
60+ 0.0f, 1.0f,
61+ baselineOriginX, baselineOriginY );
62+
63+ using( var 変換済みジオメトリ = new TransformedGeometry( this._d2dFactory, パスジオメトリ, matrix ) )
64+ {
65+ this._renderTarget.DrawGeometry( 変換済みジオメトリ, this._輪郭ブラシ, this._輪郭の太さ );
66+ this._renderTarget.FillGeometry( 変換済みジオメトリ, this._塗りつぶしブラシ );
67+ }
68+ }
69+ return Result.Ok;
70+ }
71+
72+ public override bool IsPixelSnappingDisabled( object clientDrawingContext )
73+ => false;
74+
75+ public override RawMatrix3x2 GetCurrentTransform( object clientDrawingContext )
76+ => this._renderTarget.Transform;
77+
78+ public override float GetPixelsPerDip( object clientDrawingContext )
79+ => this._renderTarget.DotsPerInch.Width / 96f;
80+
81+ private SharpDX.Direct2D1.Factory _d2dFactory = null;
82+ private RenderTarget _renderTarget = null;
83+ private Brush _輪郭ブラシ = null;
84+ private Brush _塗りつぶしブラシ = null;
85+ private float _輪郭の太さ = 1.0f;
86+ }
87+}
Show on old repository browser