Expose box sizing getters and setters in Yoga (#1701)

Summary:
Pull Request resolved: https://github.com/facebook/yoga/pull/1701

X-link: https://github.com/facebook/react-native/pull/46630

I would like to write some tests for box sizing that will drive a lot of my development as I implement content box. To do that, I need this publicly exposed. Obviously not that ideal since this currently does not do anything. Maybe we can name the value in such a way that its clear it is in development?

Changelog: [Internal]

Reviewed By: NickGerleman

Differential Revision: D63135970

fbshipit-source-id: 7520823bf925364eae45341531e012e80ec92284
This commit is contained in:
Joe Vilches
2024-09-25 15:46:55 -07:00
committed by Facebook GitHub Bot
parent 6212e561ad
commit 43d920eab0
18 changed files with 161 additions and 1 deletions

View File

@@ -4,7 +4,6 @@
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
import math
import os import os
ENUMS = { ENUMS = {
@@ -34,6 +33,7 @@ ENUMS = {
"PositionType": ["Static", "Relative", "Absolute"], "PositionType": ["Static", "Relative", "Absolute"],
"Display": ["Flex", "None"], "Display": ["Flex", "None"],
"Wrap": ["NoWrap", "Wrap", "WrapReverse"], "Wrap": ["NoWrap", "Wrap", "WrapReverse"],
"BoxSizing": ["ContentBox", "BorderBox"],
"MeasureMode": ["Undefined", "Exactly", "AtMost"], "MeasureMode": ["Undefined", "Exactly", "AtMost"],
"Dimension": ["Width", "Height"], "Dimension": ["Width", "Height"],
"Edge": [ "Edge": [

View File

@@ -0,0 +1,33 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// @generated by enums.py
package com.facebook.yoga;
public enum YogaBoxSizing {
CONTENT_BOX(0),
BORDER_BOX(1);
private final int mIntValue;
YogaBoxSizing(int intValue) {
mIntValue = intValue;
}
public int intValue() {
return mIntValue;
}
public static YogaBoxSizing fromInt(int value) {
switch (value) {
case 0: return CONTENT_BOX;
case 1: return BORDER_BOX;
default: throw new IllegalArgumentException("Unknown enum value: " + value);
}
}
}

View File

@@ -56,6 +56,8 @@ public class YogaNative {
static native void jni_YGNodeStyleSetAlignContentJNI(long nativePointer, int alignContent); static native void jni_YGNodeStyleSetAlignContentJNI(long nativePointer, int alignContent);
static native int jni_YGNodeStyleGetPositionTypeJNI(long nativePointer); static native int jni_YGNodeStyleGetPositionTypeJNI(long nativePointer);
static native void jni_YGNodeStyleSetPositionTypeJNI(long nativePointer, int positionType); static native void jni_YGNodeStyleSetPositionTypeJNI(long nativePointer, int positionType);
static native int jni_YGNodeStyleGetBoxSizingJNI(long nativePointer);
static native void jni_YGNodeStyleSetBoxSizingJNI(long nativePointer, int boxSizing);
static native int jni_YGNodeStyleGetFlexWrapJNI(long nativePointer); static native int jni_YGNodeStyleGetFlexWrapJNI(long nativePointer);
static native void jni_YGNodeStyleSetFlexWrapJNI(long nativePointer, int wrapType); static native void jni_YGNodeStyleSetFlexWrapJNI(long nativePointer, int wrapType);
static native int jni_YGNodeStyleGetOverflowJNI(long nativePointer); static native int jni_YGNodeStyleGetOverflowJNI(long nativePointer);

View File

@@ -88,6 +88,10 @@ public abstract class YogaNode implements YogaProps {
public abstract void setPositionType(YogaPositionType positionType); public abstract void setPositionType(YogaPositionType positionType);
public abstract YogaBoxSizing getBoxSizing();
public abstract void setBoxSizing(YogaBoxSizing boxSizing);
public abstract YogaWrap getWrap(); public abstract YogaWrap getWrap();
public abstract void setWrap(YogaWrap flexWrap); public abstract void setWrap(YogaWrap flexWrap);

View File

@@ -299,6 +299,14 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
YogaNative.jni_YGNodeStyleSetPositionTypeJNI(mNativePointer, positionType.intValue()); YogaNative.jni_YGNodeStyleSetPositionTypeJNI(mNativePointer, positionType.intValue());
} }
public YogaBoxSizing getBoxSizing() {
return YogaBoxSizing.fromInt(YogaNative.jni_YGNodeStyleGetBoxSizingJNI(mNativePointer));
}
public void setBoxSizing(YogaBoxSizing boxSizing) {
YogaNative.jni_YGNodeStyleSetBoxSizingJNI(mNativePointer, boxSizing.intValue());
}
public YogaWrap getWrap() { public YogaWrap getWrap() {
return YogaWrap.fromInt(YogaNative.jni_YGNodeStyleGetFlexWrapJNI(mNativePointer)); return YogaWrap.fromInt(YogaNative.jni_YGNodeStyleGetFlexWrapJNI(mNativePointer));
} }

View File

@@ -105,6 +105,8 @@ public interface YogaProps {
void setBaselineFunction(YogaBaselineFunction yogaBaselineFunction); void setBaselineFunction(YogaBaselineFunction yogaBaselineFunction);
void setBoxSizing(YogaBoxSizing boxSizing);
/* Getters */ /* Getters */
YogaValue getWidth(); YogaValue getWidth();
@@ -148,4 +150,6 @@ public interface YogaProps {
YogaValue getPosition(YogaEdge edge); YogaValue getPosition(YogaEdge edge);
float getBorder(YogaEdge edge); float getBorder(YogaEdge edge);
YogaBoxSizing getBoxSizing();
} }

View File

@@ -475,6 +475,7 @@ YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignItems);
YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignSelf); YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignSelf);
YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignContent); YG_NODE_JNI_STYLE_PROP(jint, YGAlign, AlignContent);
YG_NODE_JNI_STYLE_PROP(jint, YGPositionType, PositionType); YG_NODE_JNI_STYLE_PROP(jint, YGPositionType, PositionType);
YG_NODE_JNI_STYLE_PROP(jint, YGBoxSizing, BoxSizing);
YG_NODE_JNI_STYLE_PROP(jint, YGWrap, FlexWrap); YG_NODE_JNI_STYLE_PROP(jint, YGWrap, FlexWrap);
YG_NODE_JNI_STYLE_PROP(jint, YGOverflow, Overflow); YG_NODE_JNI_STYLE_PROP(jint, YGOverflow, Overflow);
YG_NODE_JNI_STYLE_PROP(jint, YGDisplay, Display); YG_NODE_JNI_STYLE_PROP(jint, YGDisplay, Display);
@@ -819,6 +820,12 @@ static JNINativeMethod methods[] = {
{"jni_YGNodeStyleSetPositionTypeJNI", {"jni_YGNodeStyleSetPositionTypeJNI",
"(JI)V", "(JI)V",
(void*)jni_YGNodeStyleSetPositionTypeJNI}, (void*)jni_YGNodeStyleSetPositionTypeJNI},
{"jni_YGNodeStyleGetBoxSizingJNI",
"(J)I",
(void*)jni_YGNodeStyleGetBoxSizingJNI},
{"jni_YGNodeStyleSetBoxSizingJNI",
"(JI)V",
(void*)jni_YGNodeStyleSetBoxSizingJNI},
{"jni_YGNodeStyleGetFlexWrapJNI", {"jni_YGNodeStyleGetFlexWrapJNI",
"(J)I", "(J)I",
(void*)jni_YGNodeStyleGetFlexWrapJNI}, (void*)jni_YGNodeStyleGetFlexWrapJNI},

View File

@@ -75,6 +75,10 @@ void Node::copyStyle(Node const& other) {
YGNodeCopyStyle(m_node, other.m_node); YGNodeCopyStyle(m_node, other.m_node);
} }
void Node::setBoxSizing(int boxSizing) {
YGNodeStyleSetBoxSizing(m_node, static_cast<YGBoxSizing>(boxSizing));
}
void Node::setPositionType(int positionType) { void Node::setPositionType(int positionType) {
YGNodeStyleSetPositionType(m_node, static_cast<YGPositionType>(positionType)); YGNodeStyleSetPositionType(m_node, static_cast<YGPositionType>(positionType));
} }
@@ -248,6 +252,10 @@ void Node::setGapPercent(int gutter, double gapLength) {
YGNodeStyleSetGapPercent(m_node, static_cast<YGGutter>(gutter), gapLength); YGNodeStyleSetGapPercent(m_node, static_cast<YGGutter>(gutter), gapLength);
} }
int Node::getBoxSizing(void) const {
return YGNodeStyleGetBoxSizing(m_node);
}
int Node::getPositionType(void) const { int Node::getPositionType(void) const {
return YGNodeStyleGetPositionType(m_node); return YGNodeStyleGetPositionType(m_node);
} }

View File

@@ -127,6 +127,8 @@ class Node {
void setGap(int gutter, double gapLength); void setGap(int gutter, double gapLength);
void setGapPercent(int gutter, double gapLength); void setGapPercent(int gutter, double gapLength);
void setBoxSizing(int boxSizing);
public: // Style getters public: // Style getters
int getPositionType(void) const; int getPositionType(void) const;
Value getPosition(int edge) const; Value getPosition(int edge) const;
@@ -165,6 +167,8 @@ class Node {
float getGap(int gutter); float getGap(int gutter);
int getBoxSizing(void) const;
public: // Tree hierarchy mutators public: // Tree hierarchy mutators
void insertChild(Node* child, unsigned index); void insertChild(Node* child, unsigned index);
void removeChild(Node* child); void removeChild(Node* child);

View File

@@ -110,6 +110,8 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) {
.function("setMaxHeight", &Node::setMaxHeight) .function("setMaxHeight", &Node::setMaxHeight)
.function("setMaxHeightPercent", &Node::setMaxHeightPercent) .function("setMaxHeightPercent", &Node::setMaxHeightPercent)
.function("setBoxSizing", &Node::setBoxSizing)
.function("setAspectRatio", &Node::setAspectRatio) .function("setAspectRatio", &Node::setAspectRatio)
.function("setBorder", &Node::setBorder) .function("setBorder", &Node::setBorder)
@@ -146,6 +148,8 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) {
.function("getMaxWidth", &Node::getMaxWidth) .function("getMaxWidth", &Node::getMaxWidth)
.function("getMaxHeight", &Node::getMaxHeight) .function("getMaxHeight", &Node::getMaxHeight)
.function("getBoxSizing", &Node::getBoxSizing)
.function("getAspectRatio", &Node::getAspectRatio) .function("getAspectRatio", &Node::getAspectRatio)
.function("getBorder", &Node::getBorder) .function("getBorder", &Node::getBorder)

View File

@@ -19,6 +19,11 @@ export enum Align {
SpaceEvenly = 8, SpaceEvenly = 8,
} }
export enum BoxSizing {
ContentBox = 0,
BorderBox = 1,
}
export enum Dimension { export enum Dimension {
Width = 0, Width = 0,
Height = 1, Height = 1,
@@ -137,6 +142,8 @@ const constants = {
ALIGN_SPACE_BETWEEN: Align.SpaceBetween, ALIGN_SPACE_BETWEEN: Align.SpaceBetween,
ALIGN_SPACE_AROUND: Align.SpaceAround, ALIGN_SPACE_AROUND: Align.SpaceAround,
ALIGN_SPACE_EVENLY: Align.SpaceEvenly, ALIGN_SPACE_EVENLY: Align.SpaceEvenly,
BOX_SIZING_CONTENT_BOX: BoxSizing.ContentBox,
BOX_SIZING_BORDER_BOX: BoxSizing.BorderBox,
DIMENSION_WIDTH: Dimension.Width, DIMENSION_WIDTH: Dimension.Width,
DIMENSION_HEIGHT: Dimension.Height, DIMENSION_HEIGHT: Dimension.Height,
DIRECTION_INHERIT: Direction.Inherit, DIRECTION_INHERIT: Direction.Inherit,

View File

@@ -14,6 +14,7 @@ import YGEnums from './generated/YGEnums.ts';
import type { import type {
Align, Align,
BoxSizing,
Display, Display,
Edge, Edge,
Errata, Errata,
@@ -115,6 +116,7 @@ export type Node = {
getParent(): Node | null; getParent(): Node | null;
getPosition(edge: Edge): Value; getPosition(edge: Edge): Value;
getPositionType(): PositionType; getPositionType(): PositionType;
getBoxSizing(): BoxSizing;
getWidth(): Value; getWidth(): Value;
insertChild(child: Node, index: number): void; insertChild(child: Node, index: number): void;
isDirty(): boolean; isDirty(): boolean;
@@ -169,6 +171,7 @@ export type Node = {
setPositionPercent(edge: Edge, position: number | undefined): void; setPositionPercent(edge: Edge, position: number | undefined): void;
setPositionType(positionType: PositionType): void; setPositionType(positionType: PositionType): void;
setPositionAuto(edge: Edge): void; setPositionAuto(edge: Edge): void;
setBoxSizing(boxSizing: BoxSizing): void;
setWidth(width: number | 'auto' | `${number}%` | undefined): void; setWidth(width: number | 'auto' | `${number}%` | undefined): void;
setWidthAuto(): void; setWidthAuto(): void;
setWidthPercent(width: number | undefined): void; setWidthPercent(width: number | undefined): void;

View File

@@ -33,6 +33,16 @@ const char* YGAlignToString(const YGAlign value) {
return "unknown"; return "unknown";
} }
const char* YGBoxSizingToString(const YGBoxSizing value) {
switch (value) {
case YGBoxSizingContentBox:
return "content-box";
case YGBoxSizingBorderBox:
return "border-box";
}
return "unknown";
}
const char* YGDimensionToString(const YGDimension value) { const char* YGDimensionToString(const YGDimension value) {
switch (value) { switch (value) {
case YGDimensionWidth: case YGDimensionWidth:

View File

@@ -24,6 +24,11 @@ YG_ENUM_DECL(
YGAlignSpaceAround, YGAlignSpaceAround,
YGAlignSpaceEvenly) YGAlignSpaceEvenly)
YG_ENUM_DECL(
YGBoxSizing,
YGBoxSizingContentBox,
YGBoxSizingBorderBox)
YG_ENUM_DECL( YG_ENUM_DECL(
YGDimension, YGDimension,
YGDimensionWidth, YGDimensionWidth,

View File

@@ -296,6 +296,15 @@ float YGNodeStyleGetAspectRatio(const YGNodeConstRef node) {
return op.isUndefined() ? YGUndefined : op.unwrap(); return op.isUndefined() ? YGUndefined : op.unwrap();
} }
void YGNodeStyleSetBoxSizing(YGNodeRef node, YGBoxSizing boxSizing) {
updateStyle<&Style::boxSizing, &Style::setBoxSizing>(
node, scopedEnum(boxSizing));
}
YGBoxSizing YGNodeStyleGetBoxSizing(const YGNodeConstRef node) {
return unscopedEnum(resolveRef(node)->style().boxSizing());
}
void YGNodeStyleSetWidth(YGNodeRef node, float points) { void YGNodeStyleSetWidth(YGNodeRef node, float points) {
updateStyle<&Style::dimension, &Style::setDimension>( updateStyle<&Style::dimension, &Style::setDimension>(
node, Dimension::Width, value::points(points)); node, Dimension::Width, value::points(points));

View File

@@ -95,6 +95,9 @@ YG_EXPORT void
YGNodeStyleSetGapPercent(YGNodeRef node, YGGutter gutter, float gapLength); YGNodeStyleSetGapPercent(YGNodeRef node, YGGutter gutter, float gapLength);
YG_EXPORT float YGNodeStyleGetGap(YGNodeConstRef node, YGGutter gutter); YG_EXPORT float YGNodeStyleGetGap(YGNodeConstRef node, YGGutter gutter);
YG_EXPORT void YGNodeStyleSetBoxSizing(YGNodeRef node, YGBoxSizing boxSizing);
YG_EXPORT YGBoxSizing YGNodeStyleGetBoxSizing(YGNodeConstRef node);
YG_EXPORT void YGNodeStyleSetWidth(YGNodeRef node, float width); YG_EXPORT void YGNodeStyleSetWidth(YGNodeRef node, float width);
YG_EXPORT void YGNodeStyleSetWidthPercent(YGNodeRef node, float width); YG_EXPORT void YGNodeStyleSetWidthPercent(YGNodeRef node, float width);
YG_EXPORT void YGNodeStyleSetWidthAuto(YGNodeRef node); YG_EXPORT void YGNodeStyleSetWidthAuto(YGNodeRef node);

40
yoga/enums/BoxSizing.h Normal file
View File

@@ -0,0 +1,40 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// @generated by enums.py
// clang-format off
#pragma once
#include <cstdint>
#include <yoga/YGEnums.h>
#include <yoga/enums/YogaEnums.h>
namespace facebook::yoga {
enum class BoxSizing : uint8_t {
ContentBox = YGBoxSizingContentBox,
BorderBox = YGBoxSizingBorderBox,
};
template <>
constexpr int32_t ordinalCount<BoxSizing>() {
return 2;
}
constexpr BoxSizing scopedEnum(YGBoxSizing unscoped) {
return static_cast<BoxSizing>(unscoped);
}
constexpr YGBoxSizing unscopedEnum(BoxSizing scoped) {
return static_cast<YGBoxSizing>(scoped);
}
inline const char* toString(BoxSizing e) {
return YGBoxSizingToString(unscopedEnum(e));
}
} // namespace facebook::yoga

View File

@@ -15,6 +15,7 @@
#include <yoga/algorithm/FlexDirection.h> #include <yoga/algorithm/FlexDirection.h>
#include <yoga/enums/Align.h> #include <yoga/enums/Align.h>
#include <yoga/enums/BoxSizing.h>
#include <yoga/enums/Dimension.h> #include <yoga/enums/Dimension.h>
#include <yoga/enums/Direction.h> #include <yoga/enums/Direction.h>
#include <yoga/enums/Display.h> #include <yoga/enums/Display.h>
@@ -206,6 +207,13 @@ class YG_EXPORT Style {
value == 0.0f || std::isinf(value.unwrap()) ? FloatOptional{} : value); value == 0.0f || std::isinf(value.unwrap()) ? FloatOptional{} : value);
} }
BoxSizing boxSizing() const {
return boxSizing_;
}
void setBoxSizing(BoxSizing value) {
boxSizing_ = value;
}
bool horizontalInsetsDefined() const { bool horizontalInsetsDefined() const {
return position_[yoga::to_underlying(Edge::Left)].isDefined() || return position_[yoga::to_underlying(Edge::Left)].isDefined() ||
position_[yoga::to_underlying(Edge::Right)].isDefined() || position_[yoga::to_underlying(Edge::Right)].isDefined() ||
@@ -675,6 +683,7 @@ class YG_EXPORT Style {
Wrap flexWrap_ : bitCount<Wrap>() = Wrap::NoWrap; Wrap flexWrap_ : bitCount<Wrap>() = Wrap::NoWrap;
Overflow overflow_ : bitCount<Overflow>() = Overflow::Visible; Overflow overflow_ : bitCount<Overflow>() = Overflow::Visible;
Display display_ : bitCount<Display>() = Display::Flex; Display display_ : bitCount<Display>() = Display::Flex;
BoxSizing boxSizing_ : bitCount<BoxSizing>() = BoxSizing::BorderBox;
StyleValueHandle flex_{}; StyleValueHandle flex_{};
StyleValueHandle flexGrow_{}; StyleValueHandle flexGrow_{};