|
42 | 42 | } |
43 | 43 | else |
44 | 44 | { |
45 | | - using var skBitmap = new SKBitmap(300,300,SKColorType.Bgra8888,SKAlphaType.Premul); |
46 | | - skBitmap.Erase(SKColors.White); |
47 | | - using var skCanvas = new SKCanvas(skBitmap); |
48 | | - var text = "p"; // 这里的 p 是 Symbol 字体中的 Pi 符号 |
49 | | - using var skPaint = new SKPaint(); |
50 | | - skPaint.TextSize = 50; |
51 | | - var symbolFontFile = Path.Join(AppContext.BaseDirectory, "StandardSymbolsPS.ttf"); |
52 | | - var skTypeface = |
53 | | - SKFontManager.Default.CreateTypeface(symbolFontFile); |
54 | | - |
55 | | - //skTypeface = SKTypeface.FromFamilyName("Symbol"); |
56 | | - Console.WriteLine($"Font='{symbolFontFile}' SKTypeface={skTypeface.FamilyName} GlyphCount={skTypeface.GlyphCount}"); |
57 | | - Console.WriteLine($"ContainsGlyph={skTypeface.ContainsGlyph('p')} {skTypeface.GetGlyph('p')}"); |
58 | | - |
59 | | - skPaint.Typeface = skTypeface; |
60 | | - var skFont = skTypeface.ToFont(50); |
61 | | - skPaint.Color = SKColors.Black; |
62 | | - skPaint.IsAntialias = true; |
63 | | - var skTextBlob = SKTextBlob.Create("p",skFont); |
64 | | - //skCanvas.DrawText(skTextBlob, 50, 100, skPaint); |
65 | | - |
66 | | - using (var buffer = new Buffer()) |
67 | | - { |
68 | | - buffer.AddUtf16("p"); |
69 | | - buffer.GuessSegmentProperties(); |
70 | | - buffer.Language = new Language(CultureInfo.CurrentCulture); |
71 | | - |
72 | | - var face = new HarfBuzzSharp.Face(GetTable); |
73 | | - |
74 | | - Blob? GetTable(Face f, Tag tag) |
75 | | - { |
76 | | - var size = skTypeface.GetTableSize(tag); |
77 | | - var data = Marshal.AllocCoTaskMem(size); |
78 | | - if (skTypeface.TryGetTableData(tag, 0, size, data)) |
79 | | - { |
80 | | - return new Blob(data, size, MemoryMode.ReadOnly, () => Marshal.FreeCoTaskMem(data)); |
81 | | - } |
82 | | - else |
83 | | - { |
84 | | - return null; |
85 | | - } |
86 | | - } |
87 | | - |
88 | | - var font = new HarfBuzzSharp.Font(face); |
89 | | - font.SetFunctionsOpenType(); |
90 | | - |
91 | | - var tryGetGlyph = font.TryGetGlyph('p',out uint glyph); |
92 | | - Console.WriteLine($"TryGetGlyph={tryGetGlyph} {glyph}"); |
93 | | - |
94 | | - if (tryGetGlyph) |
95 | | - { |
96 | | - Span<byte> byteBuffer = stackalloc byte[sizeof(ushort)]; |
97 | | - BitConverter.TryWriteBytes(byteBuffer, (ushort)glyph); |
98 | | - |
99 | | - skTextBlob = SKTextBlob.Create(byteBuffer, SKTextEncoding.GlyphId, skFont); |
100 | | - skCanvas.DrawText(skTextBlob, 100, 100, skPaint); |
101 | | - } |
102 | | - |
103 | | - font.Shape(buffer); |
104 | | - } |
105 | | - |
106 | | - var outputFile = Path.Join(outputFolder, $"{DateTime.Now:HHmmss}.png"); |
107 | | - using var outputStream = File.OpenWrite(outputFile); |
108 | | - skBitmap.Encode(outputStream, SKEncodedImageFormat.Png, 100); |
109 | | - if (File.Exists(outputFile)) |
110 | | - { |
111 | | - return; |
112 | | - } |
113 | | - |
114 | 45 | if (OperatingSystem.IsWindows()) |
115 | 46 | { |
116 | 47 | // Debug mode |
|
0 commit comments