Skip to content

Commit 349fbff

Browse files
CSS Grid algorithm 1/N: data structures (#57459)
Summary: Pull Request resolved: #57459 First in a series of PRs splitting the grid layout algorithm into reviewable chunks. Addresses feedback from react/yoga#1894. ## Summary - Rename `style/GridTrack.h` to `style/GridTrackSize.h` to match the type it defines and CSS grid naming spec. - Remove layout state fields (`baseSize`, `growthLimit`, `infinitelyGrowable`) from `GridTrackSize` — these belong in the algorithm layer, not the style definition - Add `algorithm/grid/GridTrack.h`, wraps `GridTrackSize` with layout state via composition (removed inheritance) - Add `algorithm/grid/GridItem.h`, represents a grid item with its resolved position (after autoplacement algorithm) and flags used during track sizing algorithm X-link: react/yoga#1923 Differential Revision: D110780559 Pulled By: rozele
1 parent 918fb15 commit 349fbff

14 files changed

Lines changed: 331 additions & 36 deletions

packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <yoga/Yoga.h>
99
#include <yoga/debug/AssertFatal.h>
1010
#include <yoga/node/Node.h>
11-
#include <yoga/style/GridTrack.h>
11+
#include <yoga/style/GridTrackSize.h>
1212

1313
using namespace facebook;
1414
using namespace facebook::yoga;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and 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+
8+
#pragma once
9+
10+
#include <yoga/enums/Dimension.h>
11+
#include <yoga/node/Node.h>
12+
#include <cstddef>
13+
#include <map>
14+
#include <vector>
15+
16+
namespace facebook::yoga {
17+
18+
// A grid item with its resolved position in the grid. Positions are set by the
19+
// auto-placement algorithm and consumed by the track sizing algorithm.
20+
struct GridItem {
21+
size_t columnStart;
22+
size_t columnEnd;
23+
size_t rowStart;
24+
size_t rowEnd;
25+
yoga::Node* node;
26+
27+
// Additional offset added to item to align baselines
28+
// https://www.w3.org/TR/css-grid-1/#algo-baseline-shims
29+
float baselineShim = 0.0f;
30+
31+
// Flags used for optimizations in track sizing algorithm.
32+
bool crossesIntrinsicRow = false;
33+
bool crossesIntrinsicColumn = false;
34+
bool crossesFlexibleRow = false;
35+
bool crossesFlexibleColumn = false;
36+
37+
GridItem(
38+
size_t columnStart,
39+
size_t columnEnd,
40+
size_t rowStart,
41+
size_t rowEnd,
42+
yoga::Node* node,
43+
float baselineShim = 0.0f)
44+
: columnStart(columnStart),
45+
columnEnd(columnEnd),
46+
rowStart(rowStart),
47+
rowEnd(rowEnd),
48+
node(node),
49+
baselineShim(baselineShim) {}
50+
51+
// Helper functions used by the track sizing algorithm
52+
bool crossesIntrinsicTrack(Dimension dimension) const {
53+
return dimension == Dimension::Width ? crossesIntrinsicColumn
54+
: crossesIntrinsicRow;
55+
}
56+
bool crossesFlexibleTrack(Dimension dimension) const {
57+
return dimension == Dimension::Width ? crossesFlexibleColumn
58+
: crossesFlexibleRow;
59+
}
60+
};
61+
62+
// Baseline sharing groups - items grouped by their starting row for the
63+
// resolve intrinsic size step in track sizing algorithm.
64+
// https://www.w3.org/TR/css-grid-1/#algo-baseline-shims
65+
using BaselineItemGroups = std::map<size_t, std::vector<GridItem*>>;
66+
67+
} // namespace facebook::yoga
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and 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+
8+
#pragma once
9+
10+
#include <yoga/style/GridTrackSize.h>
11+
12+
namespace facebook::yoga {
13+
14+
// https://www.w3.org/TR/css-grid-1/#algo-track-sizing
15+
struct GridTrack {
16+
// Mutable state used by the track sizing algorithm
17+
// https://www.w3.org/TR/css-grid-1/#base-size
18+
float baseSize = 0.0f;
19+
// https://www.w3.org/TR/css-grid-1/#growth-limit
20+
float growthLimit = 0.0f;
21+
// https://www.w3.org/TR/css-grid-1/#infinitely-growable
22+
bool infinitelyGrowable = false;
23+
24+
explicit GridTrack(const GridTrackSize& ts) : trackSize_(ts) {}
25+
26+
const GridTrackSize& trackSize() const {
27+
return trackSize_;
28+
}
29+
30+
private:
31+
// Sizing functions for this track, immutable after construction
32+
GridTrackSize trackSize_;
33+
};
34+
35+
} // namespace facebook::yoga

packages/react-native/ReactCommon/yoga/yoga/style/GridTrack.h renamed to packages/react-native/ReactCommon/yoga/yoga/style/GridTrackSize.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,13 @@
1111
#include <vector>
1212

1313
namespace facebook::yoga {
14+
// Represents a track size as defined in
1415
// https://www.w3.org/TR/css-grid-1/#typedef-track-size
16+
// and helper functions for creating common track sizes.
1517
struct GridTrackSize {
1618
StyleSizeLength minSizingFunction;
1719
StyleSizeLength maxSizingFunction;
1820

19-
// These are used in the grid layout algorithm when distributing spaces among
20-
// tracks
21-
// TODO: maybe move them to TrackSizing since these are track states
22-
float baseSize = 0.0f;
23-
float growthLimit = 0.0f;
24-
bool infinitelyGrowable = false;
25-
2621
// Static factory methods for common cases
2722
constexpr static GridTrackSize auto_() {
2823
return GridTrackSize{

packages/react-native/ReactCommon/yoga/yoga/style/Style.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#include <yoga/enums/Wrap.h>
3131
#include <yoga/numeric/FloatOptional.h>
3232
#include <yoga/style/GridLine.h>
33-
#include <yoga/style/GridTrack.h>
33+
#include <yoga/style/GridTrackSize.h>
3434
#include <yoga/style/StyleLength.h>
3535
#include <yoga/style/StyleSizeLength.h>
3636
#include <yoga/style/StyleValuePool.h>

scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12835,6 +12835,7 @@ struct facebook::jsi::detail::BeforeCaller<std::tuple<T...>> {
1283512835
}
1283612836

1283712837

12838+
using facebook::yoga::BaselineItemGroups = std::map<size_t, std::vector<facebook::yoga::GridItem*>>;
1283812839
using facebook::yoga::GridTrackList = std::vector<facebook::yoga::GridTrackSize>;
1283912840
template <typename EnumT>
1284012841
concept facebook::yoga::Enumeration = std::is_enum_v<EnumT>;
@@ -13560,6 +13561,22 @@ struct facebook::yoga::FloatOptional {
1356013561
public constexpr float unwrapOrDefault(float defaultValue) const;
1356113562
}
1356213563

13564+
struct facebook::yoga::GridItem {
13565+
public GridItem(size_t columnStart, size_t columnEnd, size_t rowStart, size_t rowEnd, facebook::yoga::Node* node, float baselineShim = 0.0f);
13566+
public bool crossesFlexibleColumn;
13567+
public bool crossesFlexibleRow;
13568+
public bool crossesFlexibleTrack(facebook::yoga::Dimension dimension) const;
13569+
public bool crossesIntrinsicColumn;
13570+
public bool crossesIntrinsicRow;
13571+
public bool crossesIntrinsicTrack(facebook::yoga::Dimension dimension) const;
13572+
public facebook::yoga::Node* node;
13573+
public float baselineShim;
13574+
public size_t columnEnd;
13575+
public size_t columnStart;
13576+
public size_t rowEnd;
13577+
public size_t rowStart;
13578+
}
13579+
1356313580
struct facebook::yoga::GridLine {
1356413581
public bool operator==(const facebook::yoga::GridLine& other) const = default;
1356513582
public constexpr bool isAuto() const;
@@ -13572,13 +13589,18 @@ struct facebook::yoga::GridLine {
1357213589
public static constexpr facebook::yoga::GridLine span(int32_t value);
1357313590
}
1357413591

13575-
struct facebook::yoga::GridTrackSize {
13592+
struct facebook::yoga::GridTrack {
13593+
public GridTrack(const facebook::yoga::GridTrackSize& ts);
1357613594
public bool infinitelyGrowable;
13595+
public const facebook::yoga::GridTrackSize& trackSize() const;
13596+
public float baseSize;
13597+
public float growthLimit;
13598+
}
13599+
13600+
struct facebook::yoga::GridTrackSize {
1357713601
public bool operator==(const facebook::yoga::GridTrackSize& other) const = default;
1357813602
public facebook::yoga::StyleSizeLength maxSizingFunction;
1357913603
public facebook::yoga::StyleSizeLength minSizingFunction;
13580-
public float baseSize;
13581-
public float growthLimit;
1358213604
public static constexpr facebook::yoga::GridTrackSize auto_();
1358313605
public static constexpr facebook::yoga::GridTrackSize fr(float fraction);
1358413606
public static constexpr facebook::yoga::GridTrackSize length(float points);

scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12458,6 +12458,7 @@ struct facebook::jsi::detail::BeforeCaller<std::tuple<T...>> {
1245812458
}
1245912459

1246012460

12461+
using facebook::yoga::BaselineItemGroups = std::map<size_t, std::vector<facebook::yoga::GridItem*>>;
1246112462
using facebook::yoga::GridTrackList = std::vector<facebook::yoga::GridTrackSize>;
1246212463
template <typename EnumT>
1246312464
concept facebook::yoga::Enumeration = std::is_enum_v<EnumT>;
@@ -13183,6 +13184,22 @@ struct facebook::yoga::FloatOptional {
1318313184
public constexpr float unwrapOrDefault(float defaultValue) const;
1318413185
}
1318513186

13187+
struct facebook::yoga::GridItem {
13188+
public GridItem(size_t columnStart, size_t columnEnd, size_t rowStart, size_t rowEnd, facebook::yoga::Node* node, float baselineShim = 0.0f);
13189+
public bool crossesFlexibleColumn;
13190+
public bool crossesFlexibleRow;
13191+
public bool crossesFlexibleTrack(facebook::yoga::Dimension dimension) const;
13192+
public bool crossesIntrinsicColumn;
13193+
public bool crossesIntrinsicRow;
13194+
public bool crossesIntrinsicTrack(facebook::yoga::Dimension dimension) const;
13195+
public facebook::yoga::Node* node;
13196+
public float baselineShim;
13197+
public size_t columnEnd;
13198+
public size_t columnStart;
13199+
public size_t rowEnd;
13200+
public size_t rowStart;
13201+
}
13202+
1318613203
struct facebook::yoga::GridLine {
1318713204
public bool operator==(const facebook::yoga::GridLine& other) const = default;
1318813205
public constexpr bool isAuto() const;
@@ -13195,13 +13212,18 @@ struct facebook::yoga::GridLine {
1319513212
public static constexpr facebook::yoga::GridLine span(int32_t value);
1319613213
}
1319713214

13198-
struct facebook::yoga::GridTrackSize {
13215+
struct facebook::yoga::GridTrack {
13216+
public GridTrack(const facebook::yoga::GridTrackSize& ts);
1319913217
public bool infinitelyGrowable;
13218+
public const facebook::yoga::GridTrackSize& trackSize() const;
13219+
public float baseSize;
13220+
public float growthLimit;
13221+
}
13222+
13223+
struct facebook::yoga::GridTrackSize {
1320013224
public bool operator==(const facebook::yoga::GridTrackSize& other) const = default;
1320113225
public facebook::yoga::StyleSizeLength maxSizingFunction;
1320213226
public facebook::yoga::StyleSizeLength minSizingFunction;
13203-
public float baseSize;
13204-
public float growthLimit;
1320513227
public static constexpr facebook::yoga::GridTrackSize auto_();
1320613228
public static constexpr facebook::yoga::GridTrackSize fr(float fraction);
1320713229
public static constexpr facebook::yoga::GridTrackSize length(float points);

scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12688,6 +12688,7 @@ struct facebook::jsi::detail::BeforeCaller<std::tuple<T...>> {
1268812688
}
1268912689

1269012690

12691+
using facebook::yoga::BaselineItemGroups = std::map<size_t, std::vector<facebook::yoga::GridItem*>>;
1269112692
using facebook::yoga::GridTrackList = std::vector<facebook::yoga::GridTrackSize>;
1269212693
template <typename EnumT>
1269312694
concept facebook::yoga::Enumeration = std::is_enum_v<EnumT>;
@@ -13413,6 +13414,22 @@ struct facebook::yoga::FloatOptional {
1341313414
public constexpr float unwrapOrDefault(float defaultValue) const;
1341413415
}
1341513416

13417+
struct facebook::yoga::GridItem {
13418+
public GridItem(size_t columnStart, size_t columnEnd, size_t rowStart, size_t rowEnd, facebook::yoga::Node* node, float baselineShim = 0.0f);
13419+
public bool crossesFlexibleColumn;
13420+
public bool crossesFlexibleRow;
13421+
public bool crossesFlexibleTrack(facebook::yoga::Dimension dimension) const;
13422+
public bool crossesIntrinsicColumn;
13423+
public bool crossesIntrinsicRow;
13424+
public bool crossesIntrinsicTrack(facebook::yoga::Dimension dimension) const;
13425+
public facebook::yoga::Node* node;
13426+
public float baselineShim;
13427+
public size_t columnEnd;
13428+
public size_t columnStart;
13429+
public size_t rowEnd;
13430+
public size_t rowStart;
13431+
}
13432+
1341613433
struct facebook::yoga::GridLine {
1341713434
public bool operator==(const facebook::yoga::GridLine& other) const = default;
1341813435
public constexpr bool isAuto() const;
@@ -13425,13 +13442,18 @@ struct facebook::yoga::GridLine {
1342513442
public static constexpr facebook::yoga::GridLine span(int32_t value);
1342613443
}
1342713444

13428-
struct facebook::yoga::GridTrackSize {
13445+
struct facebook::yoga::GridTrack {
13446+
public GridTrack(const facebook::yoga::GridTrackSize& ts);
1342913447
public bool infinitelyGrowable;
13448+
public const facebook::yoga::GridTrackSize& trackSize() const;
13449+
public float baseSize;
13450+
public float growthLimit;
13451+
}
13452+
13453+
struct facebook::yoga::GridTrackSize {
1343013454
public bool operator==(const facebook::yoga::GridTrackSize& other) const = default;
1343113455
public facebook::yoga::StyleSizeLength maxSizingFunction;
1343213456
public facebook::yoga::StyleSizeLength minSizingFunction;
13433-
public float baseSize;
13434-
public float growthLimit;
1343513457
public static constexpr facebook::yoga::GridTrackSize auto_();
1343613458
public static constexpr facebook::yoga::GridTrackSize fr(float fraction);
1343713459
public static constexpr facebook::yoga::GridTrackSize length(float points);

scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14655,6 +14655,7 @@ struct facebook::jsi::detail::BeforeCaller<std::tuple<T...>> {
1465514655
}
1465614656

1465714657

14658+
using facebook::yoga::BaselineItemGroups = std::map<size_t, std::vector<facebook::yoga::GridItem*>>;
1465814659
using facebook::yoga::GridTrackList = std::vector<facebook::yoga::GridTrackSize>;
1465914660
template <typename EnumT>
1466014661
concept facebook::yoga::Enumeration = std::is_enum_v<EnumT>;
@@ -15380,6 +15381,22 @@ struct facebook::yoga::FloatOptional {
1538015381
public constexpr float unwrapOrDefault(float defaultValue) const;
1538115382
}
1538215383

15384+
struct facebook::yoga::GridItem {
15385+
public GridItem(size_t columnStart, size_t columnEnd, size_t rowStart, size_t rowEnd, facebook::yoga::Node* node, float baselineShim = 0.0f);
15386+
public bool crossesFlexibleColumn;
15387+
public bool crossesFlexibleRow;
15388+
public bool crossesFlexibleTrack(facebook::yoga::Dimension dimension) const;
15389+
public bool crossesIntrinsicColumn;
15390+
public bool crossesIntrinsicRow;
15391+
public bool crossesIntrinsicTrack(facebook::yoga::Dimension dimension) const;
15392+
public facebook::yoga::Node* node;
15393+
public float baselineShim;
15394+
public size_t columnEnd;
15395+
public size_t columnStart;
15396+
public size_t rowEnd;
15397+
public size_t rowStart;
15398+
}
15399+
1538315400
struct facebook::yoga::GridLine {
1538415401
public bool operator==(const facebook::yoga::GridLine& other) const = default;
1538515402
public constexpr bool isAuto() const;
@@ -15392,13 +15409,18 @@ struct facebook::yoga::GridLine {
1539215409
public static constexpr facebook::yoga::GridLine span(int32_t value);
1539315410
}
1539415411

15395-
struct facebook::yoga::GridTrackSize {
15412+
struct facebook::yoga::GridTrack {
15413+
public GridTrack(const facebook::yoga::GridTrackSize& ts);
1539615414
public bool infinitelyGrowable;
15415+
public const facebook::yoga::GridTrackSize& trackSize() const;
15416+
public float baseSize;
15417+
public float growthLimit;
15418+
}
15419+
15420+
struct facebook::yoga::GridTrackSize {
1539715421
public bool operator==(const facebook::yoga::GridTrackSize& other) const = default;
1539815422
public facebook::yoga::StyleSizeLength maxSizingFunction;
1539915423
public facebook::yoga::StyleSizeLength minSizingFunction;
15400-
public float baseSize;
15401-
public float growthLimit;
1540215424
public static constexpr facebook::yoga::GridTrackSize auto_();
1540315425
public static constexpr facebook::yoga::GridTrackSize fr(float fraction);
1540415426
public static constexpr facebook::yoga::GridTrackSize length(float points);

0 commit comments

Comments
 (0)