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); }