private static void CompileBoxArea(StylePropertyReader reader, out Length top, out Length right, out Length bottom, out Length left)
        {
            top    = 0f;
            right  = 0f;
            bottom = 0f;
            left   = 0f;

            var valueCount = reader.valueCount;

            switch (valueCount)
            {
            // apply to all four sides
            case 0:
                break;

            case 1:
            {
                top = right = bottom = left = reader.ReadLength(0);
                break;
            }

            // vertical | horizontal
            case 2:
            {
                top  = bottom = reader.ReadLength(0);
                left = right = reader.ReadLength(1);
                break;
            }

            // top | horizontal | bottom
            case 3:
            {
                top    = reader.ReadLength(0);
                left   = right = reader.ReadLength(1);
                bottom = reader.ReadLength(2);
                break;
            }

            // top | right | bottom | left
            default:
            {
                top    = reader.ReadLength(0);
                right  = reader.ReadLength(1);
                bottom = reader.ReadLength(2);
                left   = reader.ReadLength(3);
                break;
            }
            }
        }
        private static bool CompileFlexShorthand(StylePropertyReader reader, out float grow, out float shrink, out Length basis)
        {
            grow   = 0f;
            shrink = 1f;
            basis  = Length.Auto();

            bool valid      = false;
            var  valueCount = reader.valueCount;

            if (valueCount == 1 && reader.IsValueType(0, StyleValueType.Keyword))
            {
                // Handle none | auto
                if (reader.IsKeyword(0, StyleValueKeyword.None))
                {
                    valid  = true;
                    grow   = 0f;
                    shrink = 0f;
                    basis  = Length.Auto();
                }
                else if (reader.IsKeyword(0, StyleValueKeyword.Auto))
                {
                    valid  = true;
                    grow   = 1f;
                    shrink = 1f;
                    basis  = Length.Auto();
                }
            }
            else if (valueCount <= 3)
            {
                // Handle [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
                valid = true;

                grow   = 0f;
                shrink = 1f;
                basis  = Length.Percent(0);

                bool growFound  = false;
                bool basisFound = false;
                for (int i = 0; i < valueCount && valid; i++)
                {
                    var valueType = reader.GetValueType(i);
                    if (valueType == StyleValueType.Dimension || valueType == StyleValueType.Keyword)
                    {
                        // Basis
                        if (basisFound)
                        {
                            valid = false;
                            break;
                        }

                        basisFound = true;
                        if (valueType == StyleValueType.Keyword)
                        {
                            if (reader.IsKeyword(i, StyleValueKeyword.Auto))
                            {
                                basis = Length.Auto();
                            }
                        }
                        else if (valueType == StyleValueType.Dimension)
                        {
                            basis = reader.ReadLength(i);
                        }

                        if (growFound && i != valueCount - 1)
                        {
                            // If grow is already processed basis must be the last value
                            valid = false;
                        }
                    }
                    else if (valueType == StyleValueType.Float)
                    {
                        var value = reader.ReadFloat(i);
                        if (!growFound)
                        {
                            growFound = true;
                            grow      = value;
                        }
                        else
                        {
                            shrink = value;
                        }
                    }
                    else
                    {
                        valid = false;
                    }
                }
            }

            return(valid);
        }