示例#1
0
        internal static Vector2 MeasureVisualElementTextSize(VisualElement ve, string textToMeasure, float width, MeasureMode widthMode, float height, MeasureMode heightMode, TextHandle textHandle)
        {
            float measuredWidth  = float.NaN;
            float measuredHeight = float.NaN;

            Font usedFont = ve.computedStyle.unityFont.value;

            if (textToMeasure == null || usedFont == null)
            {
                return(new Vector2(measuredWidth, measuredHeight));
            }

            var elementScaling = ve.ComputeGlobalScale();

            float scaling = (elementScaling.x + elementScaling.y) * 0.5f * ve.scaledPixelsPerPoint;

            if (scaling <= 0)
            {
                return(Vector2.zero);
            }

            if (widthMode == MeasureMode.Exactly)
            {
                measuredWidth = width;
            }
            else
            {
                var textParams = GetTextSettings(ve, textToMeasure);
                textParams.wordWrap = false;
                textParams.richText = true;

                //we make sure to round up as yoga could decide to round down and text would start wrapping
                measuredWidth = Mathf.Ceil(textHandle.ComputeTextWidth(textParams, scaling));

                if (widthMode == MeasureMode.AtMost)
                {
                    measuredWidth = Mathf.Min(measuredWidth, width);
                }
            }

            if (heightMode == MeasureMode.Exactly)
            {
                measuredHeight = height;
            }
            else
            {
                var textParams = GetTextSettings(ve, textToMeasure);
                textParams.wordWrapWidth = measuredWidth;

                measuredHeight = Mathf.Ceil(textHandle.ComputeTextHeight(textParams, scaling));

                if (heightMode == MeasureMode.AtMost)
                {
                    measuredHeight = Mathf.Min(measuredHeight, height);
                }
            }

            return(new Vector2(measuredWidth, measuredHeight));
        }
示例#2
0
 public float ComputeTextWidth(string textToMeasure, bool wordWrap, float width, float height)
 {
     ConvertUssToTextGenerationSettings(s_LayoutSettings);
     s_LayoutSettings.text       = textToMeasure;
     s_LayoutSettings.screenRect = new Rect(0, 0, width, height);
     s_LayoutSettings.wordWrap   = wordWrap;
     return(textHandle.ComputeTextWidth(s_LayoutSettings));
 }
示例#3
0
        internal static Vector2 MeasureVisualElementTextSize(VisualElement ve, string textToMeasure, float width, VisualElement.MeasureMode widthMode, float height, VisualElement.MeasureMode heightMode, TextHandle textHandle)
        {
            float   num   = float.NaN;
            float   num2  = float.NaN;
            Font    value = ve.computedStyle.unityFont.value;
            bool    flag  = textToMeasure == null || value == null;
            Vector2 result;

            if (flag)
            {
                result = new Vector2(num, num2);
            }
            else
            {
                Vector3 vector = ve.ComputeGlobalScale();
                bool    flag2  = vector.x + vector.y <= 0f || ve.scaledPixelsPerPoint <= 0f;
                if (flag2)
                {
                    result = Vector2.zero;
                }
                else
                {
                    float scaledPixelsPerPoint = ve.scaledPixelsPerPoint;
                    float num3  = 0.02f;
                    float num4  = num3 / scaledPixelsPerPoint;
                    bool  flag3 = widthMode == VisualElement.MeasureMode.Exactly;
                    if (flag3)
                    {
                        num = width;
                    }
                    else
                    {
                        MeshGenerationContextUtils.TextParams textSettings = TextElement.GetTextSettings(ve, textToMeasure);
                        textSettings.wordWrap = false;
                        textSettings.richText = false;
                        num = textHandle.ComputeTextWidth(textSettings, scaledPixelsPerPoint);
                        num = ((num < num4) ? 0f : AlignmentUtils.CeilToPixelGrid(num, scaledPixelsPerPoint, num3));
                        bool flag4 = widthMode == VisualElement.MeasureMode.AtMost;
                        if (flag4)
                        {
                            num = Mathf.Min(num, width);
                        }
                    }
                    bool flag5 = heightMode == VisualElement.MeasureMode.Exactly;
                    if (flag5)
                    {
                        num2 = height;
                    }
                    else
                    {
                        MeshGenerationContextUtils.TextParams textSettings2 = TextElement.GetTextSettings(ve, textToMeasure);
                        textSettings2.wordWrapWidth = num;
                        textSettings2.richText      = false;
                        num2 = textHandle.ComputeTextHeight(textSettings2, scaledPixelsPerPoint);
                        num2 = ((num2 < num4) ? 0f : AlignmentUtils.CeilToPixelGrid(num2, scaledPixelsPerPoint, num3));
                        bool flag6 = heightMode == VisualElement.MeasureMode.AtMost;
                        if (flag6)
                        {
                            num2 = Mathf.Min(num2, height);
                        }
                    }
                    result = new Vector2(num, num2);
                }
            }
            return(result);
        }
示例#4
0
        internal static Vector2 MeasureVisualElementTextSize(VisualElement ve, string textToMeasure, float width, MeasureMode widthMode, float height, MeasureMode heightMode, TextHandle textHandle)
        {
            float measuredWidth  = float.NaN;
            float measuredHeight = float.NaN;

            Font usedFont = ve.computedStyle.unityFont.value;

            if (textToMeasure == null || usedFont == null)
            {
                return(new Vector2(measuredWidth, measuredHeight));
            }

            var elementScaling = ve.ComputeGlobalScale();

            if (elementScaling.x + elementScaling.y <= 0 || ve.scaledPixelsPerPoint <= 0)
            {
                return(Vector2.zero);
            }

            float pixelsPerPoint = ve.scaledPixelsPerPoint;
            float pixelOffset    = 0.02f;
            float pointOffset    = pixelOffset / pixelsPerPoint;

            if (widthMode == MeasureMode.Exactly)
            {
                measuredWidth = width;
            }
            else
            {
                var textParams = GetTextSettings(ve, textToMeasure);
                textParams.wordWrap = false;
                textParams.richText = false;

                // Case 1215962: round up as yoga could decide to round down and text would start wrapping
                measuredWidth = textHandle.ComputeTextWidth(textParams, pixelsPerPoint);
                measuredWidth = measuredWidth < pointOffset ? 0 : AlignmentUtils.CeilToPixelGrid(measuredWidth, pixelsPerPoint, pixelOffset);

                if (widthMode == MeasureMode.AtMost)
                {
                    measuredWidth = Mathf.Min(measuredWidth, width);
                }
            }

            if (heightMode == MeasureMode.Exactly)
            {
                measuredHeight = height;
            }
            else
            {
                var textParams = GetTextSettings(ve, textToMeasure);
                textParams.wordWrapWidth = measuredWidth;
                textParams.richText      = false;

                measuredHeight = textHandle.ComputeTextHeight(textParams, pixelsPerPoint);
                measuredHeight = measuredHeight < pointOffset ? 0 : AlignmentUtils.CeilToPixelGrid(measuredHeight, pixelsPerPoint, pixelOffset);

                if (heightMode == MeasureMode.AtMost)
                {
                    measuredHeight = Mathf.Min(measuredHeight, height);
                }
            }

            return(new Vector2(measuredWidth, measuredHeight));
        }