mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-05 20:22:15 +00:00
111 lines
3.1 KiB
Plaintext
111 lines
3.1 KiB
Plaintext
//
|
|
// 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 <AsyncDisplayKit/ASDimension.h>
|
|
|
|
#import <UIKit/UIGeometry.h>
|
|
|
|
#import <AsyncDisplayKit/CoreGraphics+ASConvenience.h>
|
|
|
|
#import <AsyncDisplayKit/ASAssert.h>
|
|
|
|
#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:@"<ASSizeRange: min=%@, max=%@>",
|
|
NSStringFromCGSize(sizeRange.min),
|
|
NSStringFromCGSize(sizeRange.max)];
|
|
}
|