mirror of
				https://github.com/Ryujinx/Opentk.git
				synced 2025-11-04 14:45:09 +00:00 
			
		
		
		
	Fixed clipping issues with font layout.
Improved glyph loading speed. Fixed text measurement.
This commit is contained in:
		
							parent
							
								
									922d9ae3ff
								
							
						
					
					
						commit
						856551e212
					
				| 
						 | 
					@ -20,8 +20,8 @@ namespace OpenTK.Graphics
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        char character;
 | 
					        char character;
 | 
				
			||||||
        Font font;
 | 
					        Font font;
 | 
				
			||||||
        int width;
 | 
					        SizeF size;
 | 
				
			||||||
        static Bitmap bmp = new Bitmap(1, 1);
 | 
					        //static Bitmap bmp = new Bitmap(1, 1);
 | 
				
			||||||
        object obj = new object();
 | 
					        object obj = new object();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #region --- Constructors ---
 | 
					        #region --- Constructors ---
 | 
				
			||||||
| 
						 | 
					@ -31,12 +31,13 @@ namespace OpenTK.Graphics
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="c">The character to represent.</param>
 | 
					        /// <param name="c">The character to represent.</param>
 | 
				
			||||||
        /// <param name="f">The Font of the character.</param>
 | 
					        /// <param name="f">The Font of the character.</param>
 | 
				
			||||||
        public Glyph(char c, Font f)
 | 
					        public Glyph(char c, Font f, SizeF s)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (f == null)
 | 
					            if (f == null)
 | 
				
			||||||
                throw new ArgumentNullException("f", "You must specify a valid font");
 | 
					                throw new ArgumentNullException("f", "You must specify a valid font");
 | 
				
			||||||
            character = c;
 | 
					            character = c;
 | 
				
			||||||
            font = f;
 | 
					            font = f;
 | 
				
			||||||
 | 
					            size = s;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
| 
						 | 
					@ -82,17 +83,7 @@ namespace OpenTK.Graphics
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            get
 | 
					            get
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (width == 0)
 | 
					                return (int)System.Math.Ceiling(size.Width);
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    lock (obj)
 | 
					 | 
				
			||||||
                    using (Graphics gfx = Graphics.FromImage(bmp))
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        float w = gfx.MeasureString(Character.ToString(), font).Width;
 | 
					 | 
				
			||||||
                        width = (int)System.Math.Ceiling(w);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                return width;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,7 +94,7 @@ namespace OpenTK.Graphics
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            get
 | 
					            get
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                return font.Height;
 | 
					                return (int)System.Math.Ceiling(size.Height);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,12 +109,13 @@ namespace OpenTK.Graphics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public override string ToString()
 | 
					        public override string ToString()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return String.Format("'{0}', {1} {2}, {3} {4}", Character, Font.Name, font.Style, font.Size, font.Unit);
 | 
					            return String.Format("'{0}', {1} {2}, {3} {4}, ({5}, {6})", Character, Font.Name, font.Style, font.Size, font.Unit, Width, Height);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public override int GetHashCode()
 | 
					        public override int GetHashCode()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return character.GetHashCode() ^ font.Style.GetHashCode() ^ font.Size.GetHashCode() ^ font.Unit.GetHashCode();
 | 
					            //return character.GetHashCode() ^ font.Style.GetHashCode() ^ font.Size.GetHashCode() ^ font.Unit.GetHashCode();
 | 
				
			||||||
 | 
					            return character.GetHashCode() ^ font.GetHashCode() ^ size.GetHashCode();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #region IEquatable<Glyph> Members
 | 
					        #region IEquatable<Glyph> Members
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ namespace OpenTK.Graphics
 | 
				
			||||||
                font.MeasureText(text, SizeF.Empty, null, ranges);
 | 
					                font.MeasureText(text, SizeF.Empty, null, ranges);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                int current = 0;
 | 
					                int current = 0;
 | 
				
			||||||
                //foreach (char c in text)
 | 
					
 | 
				
			||||||
                foreach (RectangleF range in ranges)
 | 
					                foreach (RectangleF range in ranges)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    char c = text[current++];
 | 
					                    char c = text[current++];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -177,7 +177,7 @@ namespace OpenTK.Graphics
 | 
				
			||||||
        #region public float Width
 | 
					        #region public float Width
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Gets a float indicating the default line spacing of this font.
 | 
					        /// Gets a float indicating the default size of this font, in points.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public float Width
 | 
					        public float Width
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					@ -321,9 +321,15 @@ namespace OpenTK.Graphics
 | 
				
			||||||
            if (format == null)
 | 
					            if (format == null)
 | 
				
			||||||
                format = default_string_format;
 | 
					                format = default_string_format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (ranges != null)
 | 
				
			||||||
 | 
					                ranges.Clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            IntPtr[] regions = new IntPtr[GdiPlus.MaxMeasurableCharacterRanges];
 | 
					            IntPtr[] regions = new IntPtr[GdiPlus.MaxMeasurableCharacterRanges];
 | 
				
			||||||
            CharacterRange[] characterRanges = new CharacterRange[GdiPlus.MaxMeasurableCharacterRanges];
 | 
					            CharacterRange[] characterRanges = new CharacterRange[GdiPlus.MaxMeasurableCharacterRanges];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            PointF origin = PointF.Empty;
 | 
				
			||||||
 | 
					            SizeF size = SizeF.Empty;
 | 
				
			||||||
 | 
					            RectangleF rect = new RectangleF();
 | 
				
			||||||
            for (int i = 0; i < text.Length; i += GdiPlus.MaxMeasurableCharacterRanges)
 | 
					            for (int i = 0; i < text.Length; i += GdiPlus.MaxMeasurableCharacterRanges)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                int num_characters = text.Length - i > GdiPlus.MaxMeasurableCharacterRanges ? GdiPlus.MaxMeasurableCharacterRanges : text.Length - i;
 | 
					                int num_characters = text.Length - i > GdiPlus.MaxMeasurableCharacterRanges ? GdiPlus.MaxMeasurableCharacterRanges : text.Length - i;
 | 
				
			||||||
| 
						 | 
					@ -355,19 +361,21 @@ namespace OpenTK.Graphics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for (int j = 0; j < num_characters; j++)
 | 
					                for (int j = 0; j < num_characters; j++)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    status = GdiPlus.GetRegionBounds(regions[j], new HandleRef(gfx, GdiPlus.GetNativeGraphics(gfx)), ref bounding_box);
 | 
					                    status = GdiPlus.GetRegionBounds(regions[j], new HandleRef(gfx, GdiPlus.GetNativeGraphics(gfx)), ref rect);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (i == 0 && j == 0)
 | 
				
			||||||
 | 
					                        origin = rect.Location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (ranges != null)
 | 
					                    if (ranges != null)
 | 
				
			||||||
                        ranges.Add(bounding_box);
 | 
					                        ranges.Add(rect);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    status = GdiPlus.DeleteRegion(regions[j]);
 | 
					                    status = GdiPlus.DeleteRegion(regions[j]);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                bounding_box.Size = new SizeF(bounding_box.X + bounding_box.Width, bounding_box.Y + bounding_box.Height);
 | 
					                bounding_box = RectangleF.Union(bounding_box, rect);
 | 
				
			||||||
                bounding_box.Location = PointF.Empty;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
           
 | 
					
 | 
				
			||||||
            return bounding_box;
 | 
					            return new RectangleF(origin.X, origin.Y, bounding_box.Width, bounding_box.Height);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
| 
						 | 
					@ -403,20 +411,18 @@ namespace OpenTK.Graphics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #region private void LoadGlyph(char c, out Box2 rectangle)
 | 
					        #region private void LoadGlyph(char c, out RectangleF rectangle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        // Adds the specified caharacter to the texture packer.
 | 
				
			||||||
        /// Adds a glyph to the texture packer.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="c">The character of the glyph.</param>
 | 
					 | 
				
			||||||
        /// <param name="rectangle">An OpenTK.Math.Box2 that will hold the buffer for this glyph.</param>
 | 
					 | 
				
			||||||
        private void LoadGlyph(char c, out RectangleF rectangle)
 | 
					        private void LoadGlyph(char c, out RectangleF rectangle)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (pack == null)
 | 
					            if (pack == null)
 | 
				
			||||||
                PrepareTexturePacker();
 | 
					                PrepareTexturePacker();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Glyph g = new Glyph(c, font);
 | 
					            RectangleF glyph_rect = MeasureText(c.ToString(), SizeF.Empty, StringFormat.GenericDefault);
 | 
				
			||||||
            Rectangle rect = new Rectangle();
 | 
					            SizeF glyph_size = new SizeF(glyph_rect.Right, glyph_rect.Bottom);  // We need to do this, since the origin might not be (0, 0)
 | 
				
			||||||
 | 
					            Glyph g = new Glyph(c, font, glyph_size);
 | 
				
			||||||
 | 
					            Rectangle rect;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -431,6 +437,7 @@ namespace OpenTK.Graphics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            GL.BindTexture(TextureTarget.Texture2D, texture);
 | 
					            GL.BindTexture(TextureTarget.Texture2D, texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //gfx.TextRenderingHint = TextRenderingHint.AntiAlias;
 | 
				
			||||||
            gfx.Clear(System.Drawing.Color.Transparent);
 | 
					            gfx.Clear(System.Drawing.Color.Transparent);
 | 
				
			||||||
            gfx.DrawString(g.Character.ToString(), g.Font, System.Drawing.Brushes.White, 0.0f, 0.0f);
 | 
					            gfx.DrawString(g.Character.ToString(), g.Font, System.Drawing.Brushes.White, 0.0f, 0.0f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue