// // ASDimension.mm // AsyncDisplayKit // // Copyright (c) 2014-present, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. // #import #import #import #import #pragma mark - ASDimension ASDimension const ASDimensionAuto = {ASDimensionUnitAuto, 0}; ASOVERLOADABLE ASDimension ASDimensionMake(NSString *dimension) { if (dimension.length > 0) { // Handle points if ([dimension hasSuffix:@"pt"]) { return ASDimensionMake(ASDimensionUnitPoints, ASCGFloatFromString(dimension)); } // Handle auto if ([dimension isEqualToString:@"auto"]) { return ASDimensionAuto; } // Handle percent if ([dimension hasSuffix:@"%"]) { return ASDimensionMake(ASDimensionUnitFraction, (ASCGFloatFromString(dimension) / 100.0)); } } ASDisplayNodeCAssert(NO, @"Parsing dimension failed for: %@", dimension); return ASDimensionAuto; } NSString *NSStringFromASDimension(ASDimension dimension) { switch (dimension.unit) { case ASDimensionUnitPoints: return [NSString stringWithFormat:@"%.0fpt", dimension.value]; case ASDimensionUnitFraction: return [NSString stringWithFormat:@"%.0f%%", dimension.value * 100.0]; case ASDimensionUnitAuto: return @"Auto"; } } #pragma mark - ASLayoutSize ASLayoutSize const ASLayoutSizeAuto = {ASDimensionAuto, ASDimensionAuto}; #pragma mark - ASEdgeInsets ASEdgeInsets const ASEdgeInsetsZero = {}; #pragma mark - ASSizeRange ASSizeRange const ASSizeRangeZero = {}; ASSizeRange const ASSizeRangeUnconstrained = { {0, 0}, { INFINITY, INFINITY }}; struct _Range { CGFloat min; CGFloat max; /** Intersects another dimension range. If the other range does not overlap, this size range "wins" by returning a single point within its own range that is closest to the non-overlapping range. */ _Range intersect(const _Range &other) const { CGFloat newMin = MAX(min, other.min); CGFloat newMax = MIN(max, other.max); if (newMin <= newMax) { return {newMin, newMax}; } else { // No intersection. If we're before the other range, return our max; otherwise our min. if (min < other.min) { return {max, max}; } else { return {min, min}; } } } }; ASSizeRange ASSizeRangeIntersect(ASSizeRange sizeRange, ASSizeRange otherSizeRange) { auto w = _Range({sizeRange.min.width, sizeRange.max.width}).intersect({otherSizeRange.min.width, otherSizeRange.max.width}); auto h = _Range({sizeRange.min.height, sizeRange.max.height}).intersect({otherSizeRange.min.height, otherSizeRange.max.height}); return {{w.min, h.min}, {w.max, h.max}}; } NSString *NSStringFromASSizeRange(ASSizeRange sizeRange) { return [NSString stringWithFormat:@"", NSStringFromCGSize(sizeRange.min), NSStringFromCGSize(sizeRange.max)]; }