GetCharacterData() private méthode

Gets data associated with the specified codepoint.
private GetCharacterData ( string text, int offset, Textures &texture, OpenGlFontChar &data ) : int
text string The string containing the codepoint.
offset int The offset at which to read the codepoint. For surrogate pairs, two characters are read, and one otherwise.
texture Textures Receives the texture that contains the codepoint.
data OpenGlFontChar Receives the data that describes the codepoint.
Résultat int
        // --- functions ---

        /// <summary>Measures the size of a string as it would be rendered using the specified font.</summary>
        /// <param name="font">The font to use.</param>
        /// <param name="text">The string to render.</param>
        /// <returns>The size of the string.</returns>
        internal static Size MeasureString(Fonts.OpenGlFont font, string text)
        {
            int width  = 0;
            int height = 0;

            if (text != null && font != null)
            {
                for (int i = 0; i < text.Length; i++)
                {
                    Textures.Texture     texture;
                    Fonts.OpenGlFontChar data;
                    i     += font.GetCharacterData(text, i, out texture, out data) - 1;
                    width += data.TypographicSize.Width;
                    if (data.TypographicSize.Height > height)
                    {
                        height = data.TypographicSize.Height;
                    }
                }
            }
            return(new Size(width, height));
        }
        /// <summary>Renders a string to the screen.</summary>
        /// <param name="font">The font to use.</param>
        /// <param name="text">The string to render.</param>
        /// <param name="location">The location.</param>
        /// <param name="alignment">The alignment.</param>
        /// <param name="color">The color.</param>
        /// <remarks>This function sets the OpenGL blend function to glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA).</remarks>
        private static void DrawString(Fonts.OpenGlFont font, string text, Point location, TextAlignment alignment, Color128 color)
        {
            if (text == null || font == null)
            {
                return;
            }

            /*
             * Prepare the top-left coordinates for rendering, incorporating the
             * orientation of the string in relation to the specified location.
             * */
            int left;

            if ((alignment & TextAlignment.Left) == 0)
            {
                int width = 0;
                for (int i = 0; i < text.Length; i++)
                {
                    Textures.Texture     texture;
                    Fonts.OpenGlFontChar data;
                    i     += font.GetCharacterData(text, i, out texture, out data) - 1;
                    width += data.TypographicSize.Width;
                }
                if ((alignment & TextAlignment.Right) != 0)
                {
                    left = location.X - width;
                }
                else
                {
                    left = location.X - width / 2;
                }
            }
            else
            {
                left = location.X;
            }
            int top;

            if ((alignment & TextAlignment.Top) == 0)
            {
                int height = 0;
                for (int i = 0; i < text.Length; i++)
                {
                    Textures.Texture     texture;
                    Fonts.OpenGlFontChar data;
                    i += font.GetCharacterData(text, i, out texture, out data) - 1;
                    if (data.TypographicSize.Height > height)
                    {
                        height = data.TypographicSize.Height;
                    }
                }
                if ((alignment & TextAlignment.Bottom) != 0)
                {
                    top = location.Y - height;
                }
                else
                {
                    top = location.Y - height / 2;
                }
            }
            else
            {
                top = location.Y;
            }

            /*
             * Render the string.
             * */
            GL.Enable(EnableCap.Texture2D);
            for (int i = 0; i < text.Length; i++)
            {
                Textures.Texture     texture;
                Fonts.OpenGlFontChar data;
                i += font.GetCharacterData(text, i, out texture, out data) - 1;
                if (Textures.LoadTexture(texture, Textures.OpenGlTextureWrapMode.ClampClamp))
                {
                    GL.BindTexture(TextureTarget.Texture2D, texture.OpenGlTextures[(int)Textures.OpenGlTextureWrapMode.ClampClamp].Name);

                    int x = left - (data.PhysicalSize.Width - data.TypographicSize.Width) / 2;
                    int y = top - (data.PhysicalSize.Height - data.TypographicSize.Height) / 2;

                    /*
                     * In the first pass, mask off the background with pure black.
                     * */
                    GL.BlendFunc(BlendingFactor.Zero, BlendingFactor.OneMinusSrcColor);
                    GL.Begin(PrimitiveType.Polygon);
                    GL.Color4(color.A, color.A, color.A, 1.0f);
                    GL.TexCoord2(data.TextureCoordinates.Left, data.TextureCoordinates.Top);
                    GL.Vertex2(x, y);
                    GL.Color4(color.A, color.A, color.A, 1.0f);
                    GL.TexCoord2(data.TextureCoordinates.Right, data.TextureCoordinates.Top);
                    GL.Vertex2(x + data.PhysicalSize.Width, y);
                    GL.Color4(color.A, color.A, color.A, 1.0f);
                    GL.TexCoord2(data.TextureCoordinates.Right, data.TextureCoordinates.Bottom);
                    GL.Vertex2(x + data.PhysicalSize.Width, y + data.PhysicalSize.Height);
                    GL.Color4(color.A, color.A, color.A, 1.0f);
                    GL.TexCoord2(data.TextureCoordinates.Left, data.TextureCoordinates.Bottom);
                    GL.Vertex2(x, y + data.PhysicalSize.Height);
                    GL.End();

                    /*
                     * In the second pass, add the character onto the background.
                     * */
                    GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.One);
                    GL.Begin(PrimitiveType.Polygon);
                    GL.Color4(color.R, color.G, color.B, color.A);
                    GL.TexCoord2(data.TextureCoordinates.Left, data.TextureCoordinates.Top);
                    GL.Vertex2(x, y);
                    GL.Color4(color.R, color.G, color.B, color.A);
                    GL.TexCoord2(data.TextureCoordinates.Right, data.TextureCoordinates.Top);
                    GL.Vertex2(x + data.PhysicalSize.Width, y);
                    GL.Color4(color.R, color.G, color.B, color.A);
                    GL.TexCoord2(data.TextureCoordinates.Right, data.TextureCoordinates.Bottom);
                    GL.Vertex2(x + data.PhysicalSize.Width, y + data.PhysicalSize.Height);
                    GL.Color4(color.R, color.G, color.B, color.A);
                    GL.TexCoord2(data.TextureCoordinates.Left, data.TextureCoordinates.Bottom);
                    GL.Vertex2(x, y + data.PhysicalSize.Height);
                    GL.End();
                }
                left += data.TypographicSize.Width;
            }
            GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);             // HACK //
            GL.Disable(EnableCap.Texture2D);
        }
Exemple #3
0
        /// <summary>Renders a string to the screen.</summary>
        /// <param name="font">The font to use.</param>
        /// <param name="text">The string to render.</param>
        /// <param name="location">The location.</param>
        /// <param name="orientation">The orientation.</param>
        /// <param name="color">The color.</param>
        /// <remarks>This function sets the OpenGL blend function to glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA).</remarks>
        private static void DrawString(Fonts.OpenGlFont font, string text, Point location, TextAlignment alignment, Color128 color)
        {
            if (text == null)
            {
                return;
            }

            /*
             * Prepare the top-left coordinates for rendering, incorporating the
             * orientation of the string in relation to the specified location.
             * */
            int left;

            if ((alignment & TextAlignment.Left) == 0)
            {
                int width = 0;
                for (int i = 0; i < text.Length; i++)
                {
                    Textures.Texture     texture;
                    Fonts.OpenGlFontChar data;
                    i     += font.GetCharacterData(text, i, out texture, out data) - 1;
                    width += data.TypographicSize.Width;
                }
                if ((alignment & TextAlignment.Right) != 0)
                {
                    left = location.X - width;
                }
                else
                {
                    left = location.X - width / 2;
                }
            }
            else
            {
                left = location.X;
            }
            int top;

            if ((alignment & TextAlignment.Top) == 0)
            {
                int height = 0;
                for (int i = 0; i < text.Length; i++)
                {
                    Textures.Texture     texture;
                    Fonts.OpenGlFontChar data;
                    i += font.GetCharacterData(text, i, out texture, out data) - 1;
                    if (data.TypographicSize.Height > height)
                    {
                        height = data.TypographicSize.Height;
                    }
                }
                if ((alignment & TextAlignment.Bottom) != 0)
                {
                    top = location.Y - height;
                }
                else
                {
                    top = location.Y - height / 2;
                }
            }
            else
            {
                top = location.Y;
            }

            /*
             * Render the string.
             * */
            Gl.glEnable(Gl.GL_TEXTURE_2D);
            for (int i = 0; i < text.Length; i++)
            {
                Textures.Texture     texture;
                Fonts.OpenGlFontChar data;
                i += font.GetCharacterData(text, i, out texture, out data) - 1;
                if (Textures.LoadTexture(texture, Textures.OpenGlTextureWrapMode.ClampClamp))
                {
                    Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture.OpenGlTextures[(int)Textures.OpenGlTextureWrapMode.ClampClamp].Name);
                    int x = left - (data.PhysicalSize.Width - data.TypographicSize.Width) / 2;
                    int y = top - (data.PhysicalSize.Height - data.TypographicSize.Height) / 2;

                    /*
                     * In the first pass, mask off the background with pure black.
                     * */
                    Gl.glBlendFunc(Gl.GL_ZERO, Gl.GL_ONE_MINUS_SRC_COLOR);
                    Gl.glBegin(Gl.GL_POLYGON);
                    Gl.glColor4f(color.A, color.A, color.A, 1.0f);
                    Gl.glTexCoord2f(data.TextureCoordinates.Left, data.TextureCoordinates.Top);
                    Gl.glVertex2f(x, y);
                    Gl.glColor4f(color.A, color.A, color.A, 1.0f);
                    Gl.glTexCoord2f(data.TextureCoordinates.Right, data.TextureCoordinates.Top);
                    Gl.glVertex2f(x + data.PhysicalSize.Width, y);
                    Gl.glColor4f(color.A, color.A, color.A, 1.0f);
                    Gl.glTexCoord2f(data.TextureCoordinates.Right, data.TextureCoordinates.Bottom);
                    Gl.glVertex2f(x + data.PhysicalSize.Width, y + data.PhysicalSize.Height);
                    Gl.glColor4f(color.A, color.A, color.A, 1.0f);
                    Gl.glTexCoord2f(data.TextureCoordinates.Left, data.TextureCoordinates.Bottom);
                    Gl.glVertex2f(x, y + data.PhysicalSize.Height);
                    Gl.glEnd();

                    /*
                     * In the second pass, add the character onto the background.
                     * */
                    Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);
                    Gl.glBegin(Gl.GL_POLYGON);
                    Gl.glColor4f(color.R, color.G, color.B, color.A);
                    Gl.glTexCoord2f(data.TextureCoordinates.Left, data.TextureCoordinates.Top);
                    Gl.glVertex2f(x, y);
                    Gl.glColor4f(color.R, color.G, color.B, color.A);
                    Gl.glTexCoord2f(data.TextureCoordinates.Right, data.TextureCoordinates.Top);
                    Gl.glVertex2f(x + data.PhysicalSize.Width, y);
                    Gl.glColor4f(color.R, color.G, color.B, color.A);
                    Gl.glTexCoord2f(data.TextureCoordinates.Right, data.TextureCoordinates.Bottom);
                    Gl.glVertex2f(x + data.PhysicalSize.Width, y + data.PhysicalSize.Height);
                    Gl.glColor4f(color.R, color.G, color.B, color.A);
                    Gl.glTexCoord2f(data.TextureCoordinates.Left, data.TextureCoordinates.Bottom);
                    Gl.glVertex2f(x, y + data.PhysicalSize.Height);
                    Gl.glEnd();
                }
                left += data.TypographicSize.Width;
            }
            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);             // HACK //
        }