|
1 | 1 | // See https://aka.ms/new-console-template for more information |
2 | 2 |
|
| 3 | +using DocSharp.Markdown; |
| 4 | + |
| 5 | +using HarfBuzzSharp; |
| 6 | + |
| 7 | +using SkiaSharp; |
| 8 | + |
| 9 | +using SkiaWmfRenderer; |
| 10 | + |
3 | 11 | using System.Diagnostics; |
4 | 12 | using System.Drawing; |
5 | 13 | using System.Drawing.Imaging; |
| 14 | +using System.Globalization; |
| 15 | +using System.Runtime.CompilerServices; |
| 16 | +using System.Runtime.InteropServices; |
6 | 17 | using System.Text; |
7 | 18 |
|
8 | | -using DocSharp.Markdown; |
9 | | -using SkiaSharp; |
10 | | -using SkiaWmfRenderer; |
| 19 | +using Buffer = HarfBuzzSharp.Buffer; |
11 | 20 |
|
12 | 21 | var markdownText = new StringBuilder(); |
13 | 22 | var outputFolder = Path.Join(AppContext.BaseDirectory, $"Output_{Path.GetRandomFileName()}"); |
|
42 | 51 | var symbolFontFile = Path.Join(AppContext.BaseDirectory, "StandardSymbolsPS.ttf"); |
43 | 52 | var skTypeface = |
44 | 53 | SKFontManager.Default.CreateTypeface(symbolFontFile); |
| 54 | + |
45 | 55 | //skTypeface = SKTypeface.FromFamilyName("Symbol"); |
46 | 56 | Console.WriteLine($"Font='{symbolFontFile}' SKTypeface={skTypeface.FamilyName} GlyphCount={skTypeface.GlyphCount}"); |
47 | 57 | Console.WriteLine($"ContainsGlyph={skTypeface.ContainsGlyph('p')} {skTypeface.GetGlyph('p')}"); |
48 | | - |
| 58 | + |
49 | 59 | skPaint.Typeface = skTypeface; |
50 | 60 | var skFont = skTypeface.ToFont(50); |
51 | 61 | skPaint.Color = SKColors.Black; |
52 | 62 | skPaint.IsAntialias = true; |
53 | 63 | var skTextBlob = SKTextBlob.Create("p",skFont); |
54 | 64 | skCanvas.DrawText(skTextBlob, 50, 100, skPaint); |
55 | 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 | + var bytes = BitConverter.GetBytes(glyph); |
| 97 | + //SKTextEncoding.GlyphId |
| 98 | + |
| 99 | + |
| 100 | + skTextBlob = SKTextBlob.Create(bytes,SKTextEncoding.GlyphId,skFont); |
| 101 | + skCanvas.DrawText(skTextBlob, 100, 100, skPaint); |
| 102 | + } |
| 103 | + |
| 104 | + font.Shape(buffer); |
| 105 | + } |
| 106 | + |
56 | 107 | var outputFile = Path.Join(outputFolder, $"{DateTime.Now:HHmmss}.png"); |
57 | 108 | using var outputStream = File.OpenWrite(outputFile); |
58 | 109 | skBitmap.Encode(outputStream, SKEncodedImageFormat.Png, 100); |
|
0 commit comments