rounding.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #pragma once
  8. #include <react/graphics/Float.h>
  9. namespace facebook {
  10. namespace react {
  11. /*
  12. * Convenience functions for rounding float values to be aligned with a device
  13. * pixel grid.
  14. *
  15. * Usage example:
  16. * auto scaleFactor = Float{3};
  17. * auto value = Float{42.9001};
  18. * auto crispValue = roundToPixel<&std::ceil>(value, scaleFactor);
  19. * auto size = Size{value, value + 42.0};
  20. * auto crispSize = roundToPixel<&std::ceil>(size, scaleFactor);
  21. */
  22. template <Float (*RoundingFunction)(Float)>
  23. Float roundToPixel(Float value, Float scaleFactor) {
  24. return RoundingFunction(value * scaleFactor) / scaleFactor;
  25. }
  26. template <Float (*RoundingFunction)(Float)>
  27. Point roundToPixel(Point value, Float scaleFactor) {
  28. return Point{roundToPixel<RoundingFunction>(value.x, scaleFactor),
  29. roundToPixel<RoundingFunction>(value.y, scaleFactor)};
  30. }
  31. template <Float (*RoundingFunction)(Float)>
  32. Size roundToPixel(Size value, Float scaleFactor) {
  33. return Size{roundToPixel<RoundingFunction>(value.width, scaleFactor),
  34. roundToPixel<RoundingFunction>(value.height, scaleFactor)};
  35. }
  36. template <Float (*RoundingFunction)(Float)>
  37. Rect roundToPixel(Rect value, Float scaleFactor) {
  38. return Rect{roundToPixel<RoundingFunction>(value.origin),
  39. roundToPixel<RoundingFunction>(value.size)};
  40. }
  41. /*
  42. * GCC-based Android NDK does not have rounding functions as part of STL.
  43. */
  44. inline float round(float value) noexcept {
  45. return ::roundf(value);
  46. }
  47. inline double round(double value) noexcept {
  48. return ::round(value);
  49. }
  50. inline long double round(long double value) noexcept {
  51. return ::roundl(value);
  52. }
  53. inline float ceil(float value) noexcept {
  54. return ::ceilf(value);
  55. }
  56. inline double ceil(double value) noexcept {
  57. return ::ceil(value);
  58. }
  59. inline long double ceil(long double value) noexcept {
  60. return ::ceill(value);
  61. }
  62. inline float floor(float value) noexcept {
  63. return ::floorf(value);
  64. }
  65. inline double floor(double value) noexcept {
  66. return ::floor(value);
  67. }
  68. inline long double floor(long double value) noexcept {
  69. return ::floorl(value);
  70. }
  71. } // namespace react
  72. } // namespace facebook