RenderCore/Utilities/CKInternalHelpers.h (42 lines of code) (raw):
/*
* 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 <RenderCore/CKDefines.h>
#if CK_NOT_SWIFT
#import <string>
#import <UIKit/UIKit.h>
BOOL CKSubclassOverridesInstanceMethod(Class superclass, Class subclass, SEL selector) noexcept;
BOOL CKSubclassOverridesClassMethod(Class superclass, Class subclass, SEL selector) noexcept;
std::string CKStringFromPointer(const void *ptr) noexcept;
CGFloat CKScreenScale() noexcept;
CGFloat CKFloorPixelValue(CGFloat f) noexcept;
CGFloat CKCeilPixelValue(CGFloat f) noexcept;
CGFloat CKRoundPixelValue(CGFloat f) noexcept;
static inline BOOL CKFloatsEqual(const CGFloat a, const CGFloat b) noexcept {
if (isnan(a)) {
return isnan(b);
}
return fabs(a - b) < 0.0001f;
}
static inline bool CKIsGreaterThanOrEqualWithTolerance(CGFloat a,CGFloat b) {
return a > b || CKFloatsEqual(a, b);
}
static inline CGFloat CKRoundValueToPixelGrid(CGFloat value, const BOOL forceCeil,
const BOOL forceFloor) noexcept
{
CGFloat scale = CKScreenScale();
CGFloat scaledValue = value * scale;
CGFloat fractial = fmodf(scaledValue, 1.0);
if (CKFloatsEqual(fractial, 0)) {
// First we check if the value is already rounded
scaledValue = scaledValue - fractial;
} else if (CKFloatsEqual(fractial, 1.0)) {
scaledValue = scaledValue - fractial + 1.0;
} else if (forceCeil) {
// Next we check if we need to use forced rounding
scaledValue = scaledValue - fractial + 1.0f;
} else if (forceFloor) {
scaledValue = scaledValue - fractial;
} else {
// Finally we just round the value
scaledValue = scaledValue - fractial +
(fractial > 0.5f || CKFloatsEqual(fractial, 0.5f) ? 1.0f : 0.0f);
}
return scaledValue / scale;
}
// Can be used to introduce a new "checked" identifier confined to a smaller scope, i.e.
// if (id const checked = CKReturnIfResponds(any, @selector(method)) {
// [checked method]; // Safe!
// }
auto CKReturnIfResponds(id const obj, SEL const sel) -> id;
#endif