C#: Check for unsupported characters/glyphs in a font

前端 未结 1 1826
遥遥无期
遥遥无期 2020-12-11 07:57

I am working on a translation software add in (C#, .NET 2.0) which displays translated texts in a emulated device display. I have to check if all translated texts could be d

相关标签:
1条回答
  • 2020-12-11 08:05

    Are you limited to .NET 2.0? In .NET 3.0 or higher, there's the GlyphTypeface class, which can load a font file and exposes the CharacterToGlyphMap property, which I believe can do what you want.

    In .NET 2.0, I think you'll have to rely on PInvoke. Try something like:

    using System.Drawing;
    using System.Runtime.InteropServices;
    
    [DllImport("gdi32.dll", EntryPoint = "GetGlyphIndicesW")]
    private static extern uint GetGlyphIndices([In] IntPtr hdc, [In] [MarshalAs(UnmanagedType.LPTStr)] string lpsz, int c, [Out] ushort[] pgi, uint fl);
    
    [DllImport("gdi32.dll")]
    private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
    
    private const uint GGI_MARK_NONEXISTING_GLYPHS = 0x01;
    
    // Create a dummy Graphics object to establish a device context
    private Graphics _graphics = Graphics.FromImage(new Bitmap(1, 1));
    
    public bool DoesGlyphExist(char c, Font font)
    {
      // Get a device context from the dummy Graphics 
      IntPtr hdc = _graphics.GetHdc();
      ushort[] glyphIndices;
    
      try {
        IntPtr hfont = font.ToHfont();
    
        // Load the font into the device context
        SelectObject(hdc, hfont);
    
        string testString = new string(c, 1);
        glyphIndices = new ushort[testString.Length];
    
        GetGlyphIndices(hdc, testString, testString.Length, glyphIndices, GGI_MARK_NONEXISTING_GLYPHS);
    
      } finally {
    
        // Clean up our mess
        _graphics.ReleaseHdc(hdc);
      }
    
      // 0xffff is the value returned for a missing glyph
      return (glyphIndices[0] != 0xffff);
    }
    
    private void Test()
    {
      Font f = new Font("Courier New", 10);
    
      // Glyph for A is found -- returns true
      System.Diagnostics.Debug.WriteLine(DoesGlyphExist('A', f).ToString()); 
    
      // Glyph for ಠ is not found -- returns false
      System.Diagnostics.Debug.WriteLine(DoesGlyphExist((char) 0xca0, f).ToString()); 
    }
    
    0 讨论(0)
提交回复
热议问题