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

            if (textToMeasure == null || (ve.computedStyle.unityFont == null && ve.computedStyle.unityFontDefinition.IsEmpty()))
            {
                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 == VisualElement.MeasureMode.Exactly)
            {
                measuredWidth = width;
            }
            else
            {
                var textParams = MeshGenerationContextUtils.TextParams.MakeStyleBased(ve, textToMeasure);
                textParams.wordWrap = 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 == VisualElement.MeasureMode.AtMost)
                {
                    measuredWidth = Mathf.Min(measuredWidth, width);
                }
            }

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

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

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

            return(new Vector2(measuredWidth, measuredHeight));
        }
예제 #2
0
        internal static Vector2 MeasureVisualElementTextSize(TextElement te, string textToMeasure, float width, VisualElement.MeasureMode widthMode, float height, VisualElement.MeasureMode heightMode)
        {
            float measuredWidth  = float.NaN;
            float measuredHeight = float.NaN;

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

            var elementScaling = te.ComputeGlobalScale();

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

            float pixelsPerPoint = te.scaledPixelsPerPoint;

            if (widthMode == VisualElement.MeasureMode.Exactly)
            {
                measuredWidth = width;
            }
            else
            {
                measuredWidth = te.uitkTextHandle.ComputeTextWidth(textToMeasure, false, width, height);

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

            if (heightMode == VisualElement.MeasureMode.Exactly)
            {
                measuredHeight = height;
            }
            else
            {
                measuredHeight = te.uitkTextHandle.ComputeTextHeight(textToMeasure, width, height);

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

            // Case 1215962: round up as yoga could decide to round down and text would start wrapping
            float roundedWidth  = AlignmentUtils.CeilToPixelGrid(measuredWidth, pixelsPerPoint);
            float roundedHeight = AlignmentUtils.CeilToPixelGrid(measuredHeight, pixelsPerPoint);
            var   roundedValues = new Vector2(roundedWidth, roundedHeight);

            te.uitkTextHandle.MeasuredSizes = new Vector2(measuredWidth, measuredHeight);
            te.uitkTextHandle.RoundedSizes  = roundedValues;

            return(roundedValues);
        }
예제 #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);
        }