Permalink
Browse files

Fixing edge case issue in Yoga where text node was unnecessary rounde…

…d down

Reviewed By: emilsjolander

Differential Revision: D5465632

fbshipit-source-id: 57e11092a97eba5dd76daad15fa8619535ff9c1b
  • Loading branch information...
Georgiy Kassabli authored and facebook-github-bot committed Jul 27, 2017
1 parent 886ef0c commit 671c6ac04e54899738f328aecb75fd88bb245484
Showing with 26 additions and 2 deletions.
  1. +19 −0 ReactCommon/yoga/yoga/Yoga-internal.h
  2. +7 −2 ReactCommon/yoga/yoga/Yoga.c
@@ -0,0 +1,19 @@
/**
* 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.
*/
#pragma once
YG_EXTERN_C_BEGIN
WIN_EXPORT float YGRoundValueToPixelGrid(const float value,
const float pointScaleFactor,
const bool forceCeil,
const bool forceFloor);
YG_EXTERN_C_END
@@ -11,6 +11,7 @@
#include "YGNodeList.h"
#include "Yoga.h"
#include "Yoga-internal.h"
#ifdef _MSC_VER
#include <float.h>
@@ -3158,20 +3159,24 @@ static inline bool YGMeasureModeNewMeasureSizeIsStricterAndStillValid(YGMeasureM
lastSize > size && (lastComputedSize <= size || YGFloatsEqual(size, lastComputedSize));
}
static float YGRoundValueToPixelGrid(const float value,
float YGRoundValueToPixelGrid(const float value,
const float pointScaleFactor,
const bool forceCeil,
const bool forceFloor) {
float scaledValue = value * pointScaleFactor;
float fractial = fmodf(scaledValue, 1.0);
if (YGFloatsEqual(fractial, 0)) {
// Still remove fractial as fractial could be extremely small.
// First we check if the value is already rounded
scaledValue = scaledValue - fractial;
} else if (YGFloatsEqual(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.0;
} else if (forceFloor) {
scaledValue = scaledValue - fractial;
} else {
// Finally we just round the value
scaledValue = scaledValue - fractial + (fractial >= 0.5f ? 1.0 : 0);
}
return scaledValue / pointScaleFactor;

0 comments on commit 671c6ac

Please sign in to comment.