예제 #1
0
 public void Dispose()
 {
     if (vertexBuffer != null)
     {
         vertexBuffer.Dispose();
         GC.SuppressFinalize(vertexBuffer);
         vertexBuffer = null;
     }
 }
예제 #2
0
        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;
        }
예제 #3
0
 public void Dispose()
 {
     if (vertexBuffer != null)
     {
         vertexBuffer.Dispose();
         GC.SuppressFinalize(vertexBuffer);
         vertexBuffer = null;
     }
 }
예제 #4
0
        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;
        }