public void Dispose() { if (vertexBuffer != null) { vertexBuffer.Dispose(); GC.SuppressFinalize(vertexBuffer); vertexBuffer = null; } }
public void PrepareBatch() { if (glyphCache == null) { glyphCache = GlyphCache.GetCache(Height); } // Add All Glyphs foreach (Text2d t3d in Items) { foreach (char c in t3d.Text) { glyphCache.AddGlyph(c); } } // Calculate Metrics TextObject.Text = ""; TextObject.FontSize = (float)Height * .50f; System.Drawing.Font font = TextObject.Font; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; Bitmap bmp = new Bitmap(20, 20); Graphics g = Graphics.FromImage(bmp); // Create Index Buffers List<PositionTextured> verts = new List<PositionTextured>(); foreach (Text2d t2d in Items) { String text = t2d.Text; SizeF size = g.MeasureString(text, font); float factor = 1; t2d.width = size.Width * factor; t2d.height = size.Height * factor; int charsLeft = text.Length; int index = 0; // SetMeasurableCharacterRanges has a limit of 32 items per call; while (charsLeft > 0) { int charsNow = Math.Min(32, charsLeft); charsLeft -= charsNow; CharacterRange[] ranges = new CharacterRange[charsNow]; for (int i = 0; i < charsNow; i++) { ranges[i] = new CharacterRange(i + index, 1); } sf.SetMeasurableCharacterRanges(ranges); Region[] reg = g.MeasureCharacterRanges(text, font, new RectangleF(new PointF(0, 0), size), sf); for (int i = 0; i < (charsNow); i++) { GlyphItem item = glyphCache.GetGlyphItem(text[i + index]); RectangleF rectf = reg[i].GetBounds(g); RectangleF position = new RectangleF(rectf.Left * factor, rectf.Top * factor, rectf.Width * factor, rectf.Height * factor); SizeF sizef = new SizeF(item.Size.Width * factor, item.Size.Height * factor); t2d.AddGlyphPoints(verts, item.Size, position, item.UVRect); } index += charsNow; } } g.Dispose(); GC.SuppressFinalize(g); bmp.Dispose(); font.Dispose(); vertCount = verts.Count; vertexBuffer = new PositionTexturedVertexBuffer11(vertCount, RenderContext11.PrepDevice); PositionTextured[] vertBuf = (PositionTextured[])vertexBuffer.Lock(0, 0); // Lock the buffer (which will return our structs) for (int i = 0; i < vertCount; i++) { vertBuf[i] = verts[i]; } vertexBuffer.Unlock(); glyphVersion = glyphCache.Version; }
public void PrepareBatch() { if (glyphCache == null) { glyphCache = GlyphCache.GetCache(Height); } // Add All Glyphs foreach (Text2d t3d in Items) { foreach (char c in t3d.Text) { glyphCache.AddGlyph(c); } } // Calculate Metrics TextObject.Text = ""; TextObject.FontSize = (float)Height * .50f; System.Drawing.Font font = TextObject.Font; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; Bitmap bmp = new Bitmap(20, 20); Graphics g = Graphics.FromImage(bmp); // Create Index Buffers List <PositionTextured> verts = new List <PositionTextured>(); foreach (Text2d t2d in Items) { String text = t2d.Text; SizeF size = g.MeasureString(text, font); float factor = 1; t2d.width = size.Width * factor; t2d.height = size.Height * factor; int charsLeft = text.Length; int index = 0; // SetMeasurableCharacterRanges has a limit of 32 items per call; while (charsLeft > 0) { int charsNow = Math.Min(32, charsLeft); charsLeft -= charsNow; CharacterRange[] ranges = new CharacterRange[charsNow]; for (int i = 0; i < charsNow; i++) { ranges[i] = new CharacterRange(i + index, 1); } sf.SetMeasurableCharacterRanges(ranges); Region[] reg = g.MeasureCharacterRanges(text, font, new RectangleF(new PointF(0, 0), size), sf); for (int i = 0; i < (charsNow); i++) { GlyphItem item = glyphCache.GetGlyphItem(text[i + index]); RectangleF rectf = reg[i].GetBounds(g); RectangleF position = new RectangleF(rectf.Left * factor, rectf.Top * factor, rectf.Width * factor, rectf.Height * factor); SizeF sizef = new SizeF(item.Size.Width * factor, item.Size.Height * factor); t2d.AddGlyphPoints(verts, item.Size, position, item.UVRect); } index += charsNow; } } g.Dispose(); GC.SuppressFinalize(g); bmp.Dispose(); font.Dispose(); vertCount = verts.Count; vertexBuffer = new PositionTexturedVertexBuffer11(vertCount, RenderContext11.PrepDevice); PositionTextured[] vertBuf = (PositionTextured[])vertexBuffer.Lock(0, 0); // Lock the buffer (which will return our structs) for (int i = 0; i < vertCount; i++) { vertBuf[i] = verts[i]; } vertexBuffer.Unlock(); glyphVersion = glyphCache.Version; }