public bool AqurieGlyph(int charCode, out Glyph glyph, int fontSize, int outlineSize, bool bold) { var glyphContext = new GlyphParam { charCode = charCode, fontSize = fontSize, outlineSize = outlineSize, bold = bold }; if (!m_glyphs.TryGetValue(glyphContext, out glyph)) { if (m_fontContext != IntPtr.Zero) { var data = FreeTypeFontApi.GetGlyph(m_fontContext, charCode, out glyph.ftGlyph, fontSize, outlineSize, bold); if (data != IntPtr.Zero) { if (m_packer.Alloc(ref glyph)) { m_packer.UpdateData(data, glyph.ftGlyph); m_packer.Advance(glyph.ftGlyph); } else { glyph.ftGlyph.code = 0; } } if (glyph.ftGlyph.code != 0) { m_glyphs[glyphContext] = glyph; } } } return(glyph.ftGlyph.code != 0); }
unsafe public void UpdateData(IntPtr data, FreeTypeFontApi.FreeTypeGlyph glyph) { for (int y = 0; y < glyph.height; y++) { byte *srcPtr = (byte *)data.ToPointer(); fixed(byte *dstPtr = m_rawData) { int srcIndex = y * glyph.width * glyph.bpp; int dstIndex = ((m_y + y) * m_canvasSize + m_x) * glyph.bpp; FreeTypeFontApi.UFT_MemoryCopy((IntPtr)(dstPtr + dstIndex), (IntPtr)(srcPtr + srcIndex), glyph.width * glyph.bpp); } } if (m_texureUpdated != null) { m_texureUpdated(); } }
public void Dispose() { FreeTypeFontApi.DeleteFontContext(m_fontContext); m_fontContext = IntPtr.Zero; }
public FreeTypeFontAtlas(byte[] bytes) { m_fontContext = FreeTypeFontApi.CreateFontContext(bytes); Init(); }
public FreeTypeFontAtlas(string path) { m_fontContext = FreeTypeFontApi.CreateFontContext(path); Init(); }