slot 0.0.1
A real time UI render framework
载入中...
搜索中...
未找到
Style.h
浏览该文件的文档.
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 <array>
11#include <cstdint>
12#include <type_traits>
13
14#include <yoga/Yoga.h>
15
17#include <yoga/enums/Align.h>
21#include <yoga/enums/Display.h>
22#include <yoga/enums/Edge.h>
24#include <yoga/enums/Gutter.h>
25#include <yoga/enums/Justify.h>
26#include <yoga/enums/Overflow.h>
29#include <yoga/enums/Unit.h>
30#include <yoga/enums/Wrap.h>
32#include <yoga/style/GridLine.h>
37
38namespace facebook::yoga {
39
41 public:
44
45 static constexpr float DefaultFlexGrow = 0.0f;
46 static constexpr float DefaultFlexShrink = 0.0f;
47 static constexpr float WebDefaultFlexShrink = 1.0f;
48
50 return direction_;
51 }
52 void setDirection(Direction value) {
53 direction_ = value;
54 }
55
57 return flexDirection_;
58 }
60 flexDirection_ = value;
61 }
62
64 return justifyContent_;
65 }
67 justifyContent_ = value;
68 }
69
71 return justifyItems_;
72 }
74 justifyItems_ = value;
75 }
76
78 return justifySelf_;
79 }
80 void setJustifySelf(Justify value) {
81 justifySelf_ = value;
82 }
83
85 return alignContent_;
86 }
87 void setAlignContent(Align value) {
88 alignContent_ = value;
89 }
90
91 Align alignItems() const {
92 return alignItems_;
93 }
94 void setAlignItems(Align value) {
95 alignItems_ = value;
96 }
97
98 Align alignSelf() const {
99 return alignSelf_;
100 }
101 void setAlignSelf(Align value) {
102 alignSelf_ = value;
103 }
104
106 return positionType_;
107 }
109 positionType_ = value;
110 }
111
112 Wrap flexWrap() const {
113 return flexWrap_;
114 }
115 void setFlexWrap(Wrap value) {
116 flexWrap_ = value;
117 }
118
120 return overflow_;
121 }
122 void setOverflow(Overflow value) {
123 overflow_ = value;
124 }
125
126 Display display() const {
127 return display_;
128 }
129 void setDisplay(Display value) {
130 display_ = value;
131 }
132
134 return pool_.getNumber(flex_);
135 }
136 void setFlex(FloatOptional value) {
137 pool_.store(flex_, value);
138 }
139
141 return pool_.getNumber(flexGrow_);
142 }
144 pool_.store(flexGrow_, value);
145 }
146
148 return pool_.getNumber(flexShrink_);
149 }
151 pool_.store(flexShrink_, value);
152 }
153
155 return pool_.getSize(flexBasis_);
156 }
158 pool_.store(flexBasis_, value);
159 }
160
162 return pool_.getLength(margin_[yoga::to_underlying(edge)]);
163 }
164 void setMargin(Edge edge, Style::Length value) {
165 pool_.store(margin_[yoga::to_underlying(edge)], value);
166 }
167
169 return pool_.getLength(position_[yoga::to_underlying(edge)]);
170 }
171 void setPosition(Edge edge, Style::Length value) {
172 pool_.store(position_[yoga::to_underlying(edge)], value);
173 }
174
176 return pool_.getLength(padding_[yoga::to_underlying(edge)]);
177 }
178 void setPadding(Edge edge, Style::Length value) {
179 pool_.store(padding_[yoga::to_underlying(edge)], value);
180 }
181
183 return pool_.getLength(border_[yoga::to_underlying(edge)]);
184 }
185 void setBorder(Edge edge, Style::Length value) {
186 pool_.store(border_[yoga::to_underlying(edge)], value);
187 }
188
189 Style::Length gap(Gutter gutter) const {
190 return pool_.getLength(gap_[yoga::to_underlying(gutter)]);
191 }
192 void setGap(Gutter gutter, Style::Length value) {
193 pool_.store(gap_[yoga::to_underlying(gutter)], value);
194 }
195
197 return pool_.getSize(dimensions_[yoga::to_underlying(axis)]);
198 }
200 pool_.store(dimensions_[yoga::to_underlying(axis)], value);
201 }
202
204 return pool_.getSize(minDimensions_[yoga::to_underlying(axis)]);
205 }
207 pool_.store(minDimensions_[yoga::to_underlying(axis)], value);
208 }
209
210 // Grid Container Properties
212 return gridTemplateColumns_;
213 }
215 gridTemplateColumns_ = std::move(value);
216 }
217 void resizeGridTemplateColumns(size_t count) {
218 gridTemplateColumns_.resize(count);
219 }
220 void setGridTemplateColumnAt(size_t index, GridTrackSize value) {
221 gridTemplateColumns_[index] = value;
222 }
223
225 return gridTemplateRows_;
226 }
228 gridTemplateRows_ = std::move(value);
229 }
230 void resizeGridTemplateRows(size_t count) {
231 gridTemplateRows_.resize(count);
232 }
233 void setGridTemplateRowAt(size_t index, GridTrackSize value) {
234 gridTemplateRows_[index] = value;
235 }
236
238 return gridAutoColumns_;
239 }
241 gridAutoColumns_ = std::move(value);
242 }
243 void resizeGridAutoColumns(size_t count) {
244 gridAutoColumns_.resize(count);
245 }
246 void setGridAutoColumnAt(size_t index, GridTrackSize value) {
247 gridAutoColumns_[index] = value;
248 }
249
251 return gridAutoRows_;
252 }
254 gridAutoRows_ = std::move(value);
255 }
256 void resizeGridAutoRows(size_t count) {
257 gridAutoRows_.resize(count);
258 }
259 void setGridAutoRowAt(size_t index, GridTrackSize value) {
260 gridAutoRows_[index] = value;
261 }
262
263 // Grid Item Properties
264 const GridLine& gridColumnStart() const {
265 return gridColumnStart_;
266 }
268 gridColumnStart_ = value;
269 }
270
271 const GridLine& gridColumnEnd() const {
272 return gridColumnEnd_;
273 }
275 gridColumnEnd_ = value;
276 }
277
278 const GridLine& gridRowStart() const {
279 return gridRowStart_;
280 }
282 gridRowStart_ = value;
283 }
284
285 const GridLine& gridRowEnd() const {
286 return gridRowEnd_;
287 }
289 gridRowEnd_ = value;
290 }
291
293 Direction direction,
294 Dimension axis,
295 float referenceLength,
296 float ownerWidth) const {
297 const auto handle = minDimensions_[yoga::to_underlying(axis)];
298 if (handle.isUndefined()) {
299 return FloatOptional{};
300 }
301 FloatOptional value = resolve(handle, referenceLength);
302 if (boxSizing() == BoxSizing::BorderBox || !value.isDefined()) {
303 return value;
304 }
305
306 FloatOptional dimensionPaddingAndBorder = FloatOptional{
307 computePaddingAndBorderForDimension(direction, axis, ownerWidth)};
308
309 return value +
310 (dimensionPaddingAndBorder.isDefined() ? dimensionPaddingAndBorder
311 : FloatOptional{0.0});
312 }
313
315 return pool_.getSize(maxDimensions_[yoga::to_underlying(axis)]);
316 }
318 pool_.store(maxDimensions_[yoga::to_underlying(axis)], value);
319 }
320
322 Direction direction,
323 Dimension axis,
324 float referenceLength,
325 float ownerWidth) const {
326 const auto handle = maxDimensions_[yoga::to_underlying(axis)];
327 if (handle.isUndefined()) {
328 return FloatOptional{};
329 }
330 FloatOptional value = resolve(handle, referenceLength);
331 if (boxSizing() == BoxSizing::BorderBox || !value.isDefined()) {
332 return value;
333 }
334
335 FloatOptional dimensionPaddingAndBorder = FloatOptional{
336 computePaddingAndBorderForDimension(direction, axis, ownerWidth)};
337
338 return value +
339 (dimensionPaddingAndBorder.isDefined() ? dimensionPaddingAndBorder
340 : FloatOptional{0.0});
341 }
342
344 return pool_.getNumber(aspectRatio_);
345 }
347 // degenerate aspect ratios act as auto.
348 // see https://drafts.csswg.org/css-sizing-4/#valdef-aspect-ratio-ratio
349 pool_.store(
350 aspectRatio_,
351 value == 0.0f || std::isinf(value.unwrap()) ? FloatOptional{} : value);
352 }
353
355 return boxSizing_;
356 }
358 boxSizing_ = value;
359 }
360
362 return position_[yoga::to_underlying(Edge::Left)].isDefined() ||
363 position_[yoga::to_underlying(Edge::Right)].isDefined() ||
364 position_[yoga::to_underlying(Edge::All)].isDefined() ||
365 position_[yoga::to_underlying(Edge::Horizontal)].isDefined() ||
366 position_[yoga::to_underlying(Edge::Start)].isDefined() ||
367 position_[yoga::to_underlying(Edge::End)].isDefined();
368 }
369
371 return position_[yoga::to_underlying(Edge::Top)].isDefined() ||
372 position_[yoga::to_underlying(Edge::Bottom)].isDefined() ||
373 position_[yoga::to_underlying(Edge::All)].isDefined() ||
374 position_[yoga::to_underlying(Edge::Vertical)].isDefined();
375 }
376
378 const {
379 return computePosition(flexStartEdge(axis), direction).isDefined();
380 }
381
382 bool isFlexStartPositionAuto(FlexDirection axis, Direction direction) const {
383 return computePosition(flexStartEdge(axis), direction).isAuto();
384 }
385
387 const {
388 return computePosition(inlineStartEdge(axis, direction), direction)
389 .isDefined();
390 }
391
393 const {
394 return computePosition(inlineStartEdge(axis, direction), direction)
395 .isAuto();
396 }
397
399 return computePosition(flexEndEdge(axis), direction).isDefined();
400 }
401
402 bool isFlexEndPositionAuto(FlexDirection axis, Direction direction) const {
403 return computePosition(flexEndEdge(axis), direction).isAuto();
404 }
405
407 const {
408 return computePosition(inlineEndEdge(axis, direction), direction)
409 .isDefined();
410 }
411
412 bool isInlineEndPositionAuto(FlexDirection axis, Direction direction) const {
413 return computePosition(inlineEndEdge(axis, direction), direction).isAuto();
414 }
415
417 FlexDirection axis,
418 Direction direction,
419 float axisSize) const {
420 return resolve(computePosition(flexStartEdge(axis), direction), axisSize)
421 .unwrapOrDefault(0.0f);
422 }
423
425 FlexDirection axis,
426 Direction direction,
427 float axisSize) const {
428 return resolve(
429 computePosition(inlineStartEdge(axis, direction), direction),
430 axisSize)
431 .unwrapOrDefault(0.0f);
432 }
433
435 FlexDirection axis,
436 Direction direction,
437 float axisSize) const {
438 return resolve(computePosition(flexEndEdge(axis), direction), axisSize)
439 .unwrapOrDefault(0.0f);
440 }
441
443 FlexDirection axis,
444 Direction direction,
445 float axisSize) const {
446 return resolve(
447 computePosition(inlineEndEdge(axis, direction), direction),
448 axisSize)
449 .unwrapOrDefault(0.0f);
450 }
451
453 FlexDirection axis,
454 Direction direction,
455 float widthSize) const {
456 return resolve(computeMargin(flexStartEdge(axis), direction), widthSize)
457 .unwrapOrDefault(0.0f);
458 }
459
461 FlexDirection axis,
462 Direction direction,
463 float widthSize) const {
464 return resolve(
465 computeMargin(inlineStartEdge(axis, direction), direction),
466 widthSize)
467 .unwrapOrDefault(0.0f);
468 }
469
471 FlexDirection axis,
472 Direction direction,
473 float widthSize) const {
474 return resolve(computeMargin(flexEndEdge(axis), direction), widthSize)
475 .unwrapOrDefault(0.0f);
476 }
477
479 FlexDirection axis,
480 Direction direction,
481 float widthSize) const {
482 return resolve(
483 computeMargin(inlineEndEdge(axis, direction), direction),
484 widthSize)
485 .unwrapOrDefault(0.0f);
486 }
487
488 float computeFlexStartBorder(FlexDirection axis, Direction direction) const {
489 return maxOrDefined(
490 resolve(computeBorder(flexStartEdge(axis), direction), 0.0f).unwrap(),
491 0.0f);
492 }
493
495 const {
496 return maxOrDefined(
497 resolve(
498 computeBorder(inlineStartEdge(axis, direction), direction), 0.0f)
499 .unwrap(),
500 0.0f);
501 }
502
503 float computeFlexEndBorder(FlexDirection axis, Direction direction) const {
504 return maxOrDefined(
505 resolve(computeBorder(flexEndEdge(axis), direction), 0.0f).unwrap(),
506 0.0f);
507 }
508
509 float computeInlineEndBorder(FlexDirection axis, Direction direction) const {
510 return maxOrDefined(
511 resolve(computeBorder(inlineEndEdge(axis, direction), direction), 0.0f)
512 .unwrap(),
513 0.0f);
514 }
515
517 FlexDirection axis,
518 Direction direction,
519 float widthSize) const {
520 return maxOrDefined(
521 resolve(computePadding(flexStartEdge(axis), direction), widthSize)
522 .unwrap(),
523 0.0f);
524 }
525
527 FlexDirection axis,
528 Direction direction,
529 float widthSize) const {
530 return maxOrDefined(
531 resolve(
532 computePadding(inlineStartEdge(axis, direction), direction),
533 widthSize)
534 .unwrap(),
535 0.0f);
536 }
537
539 FlexDirection axis,
540 Direction direction,
541 float widthSize) const {
542 return maxOrDefined(
543 resolve(computePadding(flexEndEdge(axis), direction), widthSize)
544 .unwrap(),
545 0.0f);
546 }
547
549 FlexDirection axis,
550 Direction direction,
551 float widthSize) const {
552 return maxOrDefined(
553 resolve(
554 computePadding(inlineEndEdge(axis, direction), direction),
555 widthSize)
556 .unwrap(),
557 0.0f);
558 }
559
561 FlexDirection axis,
562 Direction direction,
563 float widthSize) const {
564 return computeInlineStartPadding(axis, direction, widthSize) +
565 computeInlineStartBorder(axis, direction);
566 }
567
569 FlexDirection axis,
570 Direction direction,
571 float widthSize) const {
572 return computeFlexStartPadding(axis, direction, widthSize) +
573 computeFlexStartBorder(axis, direction);
574 }
575
577 FlexDirection axis,
578 Direction direction,
579 float widthSize) const {
580 return computeInlineEndPadding(axis, direction, widthSize) +
581 computeInlineEndBorder(axis, direction);
582 }
583
585 FlexDirection axis,
586 Direction direction,
587 float widthSize) const {
588 return computeFlexEndPadding(axis, direction, widthSize) +
589 computeFlexEndBorder(axis, direction);
590 }
591
593 Direction direction,
594 Dimension dimension,
595 float widthSize) const {
596 FlexDirection flexDirectionForDimension = dimension == Dimension::Width
597 ? FlexDirection::Row
598 : FlexDirection::Column;
599
600 return computeFlexStartPaddingAndBorder(
601 flexDirectionForDimension, direction, widthSize) +
602 computeFlexEndPaddingAndBorder(
603 flexDirectionForDimension, direction, widthSize);
604 }
605
607 return computeInlineStartBorder(axis, Direction::LTR) +
608 computeInlineEndBorder(axis, Direction::LTR);
609 }
610
611 float computeMarginForAxis(FlexDirection axis, float widthSize) const {
612 // The total margin for a given axis does not depend on the direction
613 // so hardcoding LTR here to avoid piping direction to this function
614 return computeInlineStartMargin(axis, Direction::LTR, widthSize) +
615 computeInlineEndMargin(axis, Direction::LTR, widthSize);
616 }
617
618 float computeGapForAxis(FlexDirection axis, float ownerSize) const {
619 auto gap = isRow(axis) ? computeColumnGap() : computeRowGap();
620 return maxOrDefined(resolve(gap, ownerSize).unwrap(), 0.0f);
621 }
622
623 float computeGapForDimension(Dimension dimension, float ownerSize) const {
624 auto gap =
625 dimension == Dimension::Width ? computeColumnGap() : computeRowGap();
626 return maxOrDefined(resolve(gap, ownerSize).unwrap(), 0.0f);
627 }
628
629 bool flexStartMarginIsAuto(FlexDirection axis, Direction direction) const {
630 return computeMargin(flexStartEdge(axis), direction).isAuto();
631 }
632
633 bool flexEndMarginIsAuto(FlexDirection axis, Direction direction) const {
634 return computeMargin(flexEndEdge(axis), direction).isAuto();
635 }
636
637 bool inlineStartMarginIsAuto(FlexDirection axis, Direction direction) const {
638 return computeMargin(inlineStartEdge(axis, direction), direction).isAuto();
639 }
640
641 bool inlineEndMarginIsAuto(FlexDirection axis, Direction direction) const {
642 return computeMargin(inlineEndEdge(axis, direction), direction).isAuto();
643 }
644
645 bool operator==(const Style& other) const {
646 return direction_ == other.direction_ &&
647 flexDirection_ == other.flexDirection_ &&
648 justifyContent_ == other.justifyContent_ &&
649 justifyItems_ == other.justifyItems_ &&
650 justifySelf_ == other.justifySelf_ &&
651 alignContent_ == other.alignContent_ &&
652 alignItems_ == other.alignItems_ && alignSelf_ == other.alignSelf_ &&
653 positionType_ == other.positionType_ && flexWrap_ == other.flexWrap_ &&
654 overflow_ == other.overflow_ && display_ == other.display_ &&
655 numbersEqual(flex_, pool_, other.flex_, other.pool_) &&
656 numbersEqual(flexGrow_, pool_, other.flexGrow_, other.pool_) &&
657 numbersEqual(flexShrink_, pool_, other.flexShrink_, other.pool_) &&
658 lengthsEqual(flexBasis_, pool_, other.flexBasis_, other.pool_) &&
659 lengthsEqual(margin_, pool_, other.margin_, other.pool_) &&
660 lengthsEqual(position_, pool_, other.position_, other.pool_) &&
661 lengthsEqual(padding_, pool_, other.padding_, other.pool_) &&
662 lengthsEqual(border_, pool_, other.border_, other.pool_) &&
663 lengthsEqual(gap_, pool_, other.gap_, other.pool_) &&
664 sizeLengthsEqual(dimensions_, pool_, other.dimensions_, other.pool_) &&
665 sizeLengthsEqual(
666 minDimensions_, pool_, other.minDimensions_, other.pool_) &&
667 sizeLengthsEqual(
668 maxDimensions_, pool_, other.maxDimensions_, other.pool_) &&
669 numbersEqual(aspectRatio_, pool_, other.aspectRatio_, other.pool_) &&
670 gridTemplateColumns_ == other.gridTemplateColumns_ &&
671 gridTemplateRows_ == other.gridTemplateRows_ &&
672 gridAutoColumns_ == other.gridAutoColumns_ &&
673 gridAutoRows_ == other.gridAutoRows_ &&
674 gridColumnStart_ == other.gridColumnStart_ &&
675 gridColumnEnd_ == other.gridColumnEnd_ &&
676 gridRowStart_ == other.gridRowStart_ &&
677 gridRowEnd_ == other.gridRowEnd_;
678 }
679
680 private:
681 using Dimensions = std::array<StyleValueHandle, ordinalCount<Dimension>()>;
682 using Edges = std::array<StyleValueHandle, ordinalCount<Edge>()>;
683 using Gutters = std::array<StyleValueHandle, ordinalCount<Gutter>()>;
684
685 static inline bool numbersEqual(
686 const StyleValueHandle& lhsHandle,
687 const StyleValuePool& lhsPool,
688 const StyleValueHandle& rhsHandle,
689 const StyleValuePool& rhsPool) {
690 return (lhsHandle.isUndefined() && rhsHandle.isUndefined()) ||
691 (lhsPool.getNumber(lhsHandle) == rhsPool.getNumber(rhsHandle));
692 }
693
694 static inline bool lengthsEqual(
695 const StyleValueHandle& lhsHandle,
696 const StyleValuePool& lhsPool,
697 const StyleValueHandle& rhsHandle,
698 const StyleValuePool& rhsPool) {
699 return (lhsHandle.isUndefined() && rhsHandle.isUndefined()) ||
700 (lhsPool.getLength(lhsHandle) == rhsPool.getLength(rhsHandle));
701 }
702
703 template <size_t N>
704 static inline bool lengthsEqual(
705 const std::array<StyleValueHandle, N>& lhs,
706 const StyleValuePool& lhsPool,
707 const std::array<StyleValueHandle, N>& rhs,
708 const StyleValuePool& rhsPool) {
709 return std::equal(
710 lhs.begin(),
711 lhs.end(),
712 rhs.begin(),
713 rhs.end(),
714 [&](const auto& lhs, const auto& rhs) {
715 return lengthsEqual(lhs, lhsPool, rhs, rhsPool);
716 });
717 }
718
719 static inline bool sizeLengthsEqual(
720 const StyleValueHandle& lhsHandle,
721 const StyleValuePool& lhsPool,
722 const StyleValueHandle& rhsHandle,
723 const StyleValuePool& rhsPool) {
724 return (lhsHandle.isUndefined() && rhsHandle.isUndefined()) ||
725 (lhsPool.getSize(lhsHandle) == rhsPool.getSize(rhsHandle));
726 }
727
728 template <size_t N>
729 static inline bool sizeLengthsEqual(
730 const std::array<StyleValueHandle, N>& lhs,
731 const StyleValuePool& lhsPool,
732 const std::array<StyleValueHandle, N>& rhs,
733 const StyleValuePool& rhsPool) {
734 return std::equal(
735 lhs.begin(),
736 lhs.end(),
737 rhs.begin(),
738 rhs.end(),
739 [&](const auto& lhs, const auto& rhs) {
740 return sizeLengthsEqual(lhs, lhsPool, rhs, rhsPool);
741 });
742 }
743
745 if (gap_[yoga::to_underlying(Gutter::Column)].isDefined()) {
746 return gap_[yoga::to_underlying(Gutter::Column)];
747 } else {
748 return gap_[yoga::to_underlying(Gutter::All)];
749 }
750 }
751
753 if (gap_[yoga::to_underlying(Gutter::Row)].isDefined()) {
754 return gap_[yoga::to_underlying(Gutter::Row)];
755 } else {
756 return gap_[yoga::to_underlying(Gutter::All)];
757 }
758 }
759
761 const Edges& edges,
762 Direction layoutDirection) const {
763 if (layoutDirection == Direction::LTR &&
764 edges[yoga::to_underlying(Edge::Start)].isDefined()) {
765 return edges[yoga::to_underlying(Edge::Start)];
766 } else if (
767 layoutDirection == Direction::RTL &&
768 edges[yoga::to_underlying(Edge::End)].isDefined()) {
769 return edges[yoga::to_underlying(Edge::End)];
770 } else if (edges[yoga::to_underlying(Edge::Left)].isDefined()) {
771 return edges[yoga::to_underlying(Edge::Left)];
772 } else if (edges[yoga::to_underlying(Edge::Horizontal)].isDefined()) {
773 return edges[yoga::to_underlying(Edge::Horizontal)];
774 } else {
775 return edges[yoga::to_underlying(Edge::All)];
776 }
777 }
778
780 if (edges[yoga::to_underlying(Edge::Top)].isDefined()) {
781 return edges[yoga::to_underlying(Edge::Top)];
782 } else if (edges[yoga::to_underlying(Edge::Vertical)].isDefined()) {
783 return edges[yoga::to_underlying(Edge::Vertical)];
784 } else {
785 return edges[yoga::to_underlying(Edge::All)];
786 }
787 }
788
790 const Edges& edges,
791 Direction layoutDirection) const {
792 if (layoutDirection == Direction::LTR &&
793 edges[yoga::to_underlying(Edge::End)].isDefined()) {
794 return edges[yoga::to_underlying(Edge::End)];
795 } else if (
796 layoutDirection == Direction::RTL &&
797 edges[yoga::to_underlying(Edge::Start)].isDefined()) {
798 return edges[yoga::to_underlying(Edge::Start)];
799 } else if (edges[yoga::to_underlying(Edge::Right)].isDefined()) {
800 return edges[yoga::to_underlying(Edge::Right)];
801 } else if (edges[yoga::to_underlying(Edge::Horizontal)].isDefined()) {
802 return edges[yoga::to_underlying(Edge::Horizontal)];
803 } else {
804 return edges[yoga::to_underlying(Edge::All)];
805 }
806 }
807
809 if (edges[yoga::to_underlying(Edge::Bottom)].isDefined()) {
810 return edges[yoga::to_underlying(Edge::Bottom)];
811 } else if (edges[yoga::to_underlying(Edge::Vertical)].isDefined()) {
812 return edges[yoga::to_underlying(Edge::Vertical)];
813 } else {
814 return edges[yoga::to_underlying(Edge::All)];
815 }
816 }
817
819 const {
820 switch (edge) {
821 case PhysicalEdge::Left:
822 return computeLeftEdge(position_, direction);
823 case PhysicalEdge::Top:
824 return computeTopEdge(position_);
825 case PhysicalEdge::Right:
826 return computeRightEdge(position_, direction);
827 case PhysicalEdge::Bottom:
828 return computeBottomEdge(position_);
829 default:
830 fatalWithMessage("Invalid physical edge");
831 }
832 }
833
835 switch (edge) {
836 case PhysicalEdge::Left:
837 return computeLeftEdge(margin_, direction);
838 case PhysicalEdge::Top:
839 return computeTopEdge(margin_);
840 case PhysicalEdge::Right:
841 return computeRightEdge(margin_, direction);
842 case PhysicalEdge::Bottom:
843 return computeBottomEdge(margin_);
844 default:
845 fatalWithMessage("Invalid physical edge");
846 }
847 }
848
850 const {
851 switch (edge) {
852 case PhysicalEdge::Left:
853 return computeLeftEdge(padding_, direction);
854 case PhysicalEdge::Top:
855 return computeTopEdge(padding_);
856 case PhysicalEdge::Right:
857 return computeRightEdge(padding_, direction);
858 case PhysicalEdge::Bottom:
859 return computeBottomEdge(padding_);
860 default:
861 fatalWithMessage("Invalid physical edge");
862 }
863 }
864
866 switch (edge) {
867 case PhysicalEdge::Left:
868 return computeLeftEdge(border_, direction);
869 case PhysicalEdge::Top:
870 return computeTopEdge(border_);
871 case PhysicalEdge::Right:
872 return computeRightEdge(border_, direction);
873 case PhysicalEdge::Bottom:
874 return computeBottomEdge(border_);
875 default:
876 fatalWithMessage("Invalid physical edge");
877 }
878 }
879
889 FloatOptional resolve(StyleValueHandle handle, float referenceLength) const {
890 if (handle.isPoint()) {
891 return FloatOptional{pool_.getStoredValue(handle)};
892 }
893 if (handle.isPercent()) {
894 return FloatOptional{
895 pool_.getStoredValue(handle) * referenceLength * 0.01f};
896 }
897 return FloatOptional{};
898 }
899
900 Direction direction_ : bitCount<Direction>() = Direction::Inherit;
902 : bitCount<FlexDirection>() = FlexDirection::Column;
903 Justify justifyContent_ : bitCount<Justify>() = Justify::FlexStart;
904 Justify justifyItems_ : bitCount<Justify>() = Justify::Stretch;
905 Justify justifySelf_ : bitCount<Justify>() = Justify::Auto;
906 Align alignContent_ : bitCount<Align>() = Align::FlexStart;
907 Align alignItems_ : bitCount<Align>() = Align::Stretch;
908 Align alignSelf_ : bitCount<Align>() = Align::Auto;
910 : bitCount<PositionType>() = PositionType::Relative;
911 Wrap flexWrap_ : bitCount<Wrap>() = Wrap::NoWrap;
912 Overflow overflow_ : bitCount<Overflow>() = Overflow::Visible;
913 Display display_ : bitCount<Display>() = Display::Flex;
914 BoxSizing boxSizing_ : bitCount<BoxSizing>() = BoxSizing::BorderBox;
915
917 StyleValueHandle flexGrow_{};
918 StyleValueHandle flexShrink_{};
919 StyleValueHandle flexBasis_{StyleValueHandle::ofAuto()};
920 Edges margin_{};
921 Edges position_{};
922 Edges padding_{};
923 Edges border_{};
924 Gutters gap_{};
925 Dimensions dimensions_{
926 StyleValueHandle::ofAuto(),
927 StyleValueHandle::ofAuto()};
928 Dimensions minDimensions_{};
929 Dimensions maxDimensions_{};
930 StyleValueHandle aspectRatio_{};
931
932 // Grid properties
933 GridTrackList gridTemplateColumns_{};
934 GridTrackList gridTemplateRows_{};
935 GridTrackList gridAutoColumns_{};
936 GridTrackList gridAutoRows_{};
937 GridLine gridColumnStart_{};
938 GridLine gridColumnEnd_{};
939 GridLine gridRowStart_{};
940 GridLine gridRowEnd_{};
941
943};
944
945} // namespace facebook::yoga
#define YG_EXPORT
Definition YGMacros.h:35
Definition Style.h:40
StyleValueHandle computePosition(PhysicalEdge edge, Direction direction) const
Definition Style.h:818
void setGridRowStart(GridLine value)
Definition Style.h:281
FloatOptional aspectRatio() const
Definition Style.h:343
Style::Length margin(Edge edge) const
Definition Style.h:161
static bool numbersEqual(const StyleValueHandle &lhsHandle, const StyleValuePool &lhsPool, const StyleValueHandle &rhsHandle, const StyleValuePool &rhsPool)
Definition Style.h:685
void setMargin(Edge edge, Style::Length value)
Definition Style.h:164
PositionType positionType() const
Definition Style.h:105
Dimensions minDimensions_
Definition Style.h:928
Wrap flexWrap() const
Definition Style.h:112
StyleValueHandle computeLeftEdge(const Edges &edges, Direction layoutDirection) const
Definition Style.h:760
void setAlignItems(Align value)
Definition Style.h:94
static bool lengthsEqual(const std::array< StyleValueHandle, N > &lhs, const StyleValuePool &lhsPool, const std::array< StyleValueHandle, N > &rhs, const StyleValuePool &rhsPool)
Definition Style.h:704
BoxSizing boxSizing_
Definition Style.h:914
Style::Length padding(Edge edge) const
Definition Style.h:175
void setPadding(Edge edge, Style::Length value)
Definition Style.h:178
void setGridRowEnd(GridLine value)
Definition Style.h:288
bool isInlineStartPositionDefined(FlexDirection axis, Direction direction) const
Definition Style.h:386
const GridLine & gridRowStart() const
Definition Style.h:278
Style::SizeLength maxDimension(Dimension axis) const
Definition Style.h:314
FlexDirection flexDirection() const
Definition Style.h:56
bool isInlineEndPositionDefined(FlexDirection axis, Direction direction) const
Definition Style.h:406
StyleValuePool pool_
Definition Style.h:942
Edges border_
Definition Style.h:923
void setFlexWrap(Wrap value)
Definition Style.h:115
Direction direction_
Definition Style.h:900
StyleValueHandle flex_
Definition Style.h:916
float computeInlineStartPadding(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:526
FloatOptional resolve(StyleValueHandle handle, float referenceLength) const
Definition Style.h:889
void setFlexGrow(FloatOptional value)
Definition Style.h:143
StyleValueHandle flexGrow_
Definition Style.h:917
Style::Length gap(Gutter gutter) const
Definition Style.h:189
void setPosition(Edge edge, Style::Length value)
Definition Style.h:171
void resizeGridTemplateColumns(size_t count)
Definition Style.h:217
float computeInlineEndPaddingAndBorder(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:576
StyleValueHandle aspectRatio_
Definition Style.h:930
Style::SizeLength minDimension(Dimension axis) const
Definition Style.h:203
Direction direction() const
Definition Style.h:49
static bool sizeLengthsEqual(const StyleValueHandle &lhsHandle, const StyleValuePool &lhsPool, const StyleValueHandle &rhsHandle, const StyleValuePool &rhsPool)
Definition Style.h:719
Align alignSelf() const
Definition Style.h:98
float computeFlexStartMargin(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:452
float computeInlineEndPosition(FlexDirection axis, Direction direction, float axisSize) const
Definition Style.h:442
StyleValueHandle computeMargin(PhysicalEdge edge, Direction direction) const
Definition Style.h:834
bool flexEndMarginIsAuto(FlexDirection axis, Direction direction) const
Definition Style.h:633
std::array< StyleValueHandle, ordinalCount< Gutter >()> Gutters
Definition Style.h:683
GridLine gridRowStart_
Definition Style.h:939
Dimensions maxDimensions_
Definition Style.h:929
void setFlexShrink(FloatOptional value)
Definition Style.h:150
void resizeGridAutoRows(size_t count)
Definition Style.h:256
void setFlex(FloatOptional value)
Definition Style.h:136
bool verticalInsetsDefined() const
Definition Style.h:370
Dimensions dimensions_
Definition Style.h:925
GridLine gridColumnEnd_
Definition Style.h:938
float computeInlineEndBorder(FlexDirection axis, Direction direction) const
Definition Style.h:509
PositionType positionType_
Definition Style.h:910
StyleValueHandle computeRowGap() const
Definition Style.h:752
float computeFlexStartBorder(FlexDirection axis, Direction direction) const
Definition Style.h:488
FloatOptional flexGrow() const
Definition Style.h:140
void setBorder(Edge edge, Style::Length value)
Definition Style.h:185
float computeInlineStartPaddingAndBorder(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:560
float computeInlineEndMargin(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:478
bool isInlineStartPositionAuto(FlexDirection axis, Direction direction) const
Definition Style.h:392
float computeInlineEndPadding(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:548
void setJustifyItems(Justify value)
Definition Style.h:73
StyleValueHandle computeColumnGap() const
Definition Style.h:744
const GridLine & gridRowEnd() const
Definition Style.h:285
bool inlineEndMarginIsAuto(FlexDirection axis, Direction direction) const
Definition Style.h:641
static bool lengthsEqual(const StyleValueHandle &lhsHandle, const StyleValuePool &lhsPool, const StyleValueHandle &rhsHandle, const StyleValuePool &rhsPool)
Definition Style.h:694
float computeFlexStartPadding(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:516
void setDirection(Direction value)
Definition Style.h:52
float computeFlexEndBorder(FlexDirection axis, Direction direction) const
Definition Style.h:503
Align alignItems_
Definition Style.h:907
StyleValueHandle computePadding(PhysicalEdge edge, Direction direction) const
Definition Style.h:849
bool operator==(const Style &other) const
Definition Style.h:645
Overflow overflow_
Definition Style.h:912
Justify justifyItems() const
Definition Style.h:70
Style::SizeLength flexBasis() const
Definition Style.h:154
Style::Length border(Edge edge) const
Definition Style.h:182
const GridLine & gridColumnStart() const
Definition Style.h:264
void setGridAutoColumnAt(size_t index, GridTrackSize value)
Definition Style.h:246
void resizeGridTemplateRows(size_t count)
Definition Style.h:230
Justify justifyContent_
Definition Style.h:903
FlexDirection flexDirection_
Definition Style.h:902
void setGridTemplateRows(GridTrackList value)
Definition Style.h:227
void setDimension(Dimension axis, Style::SizeLength value)
Definition Style.h:199
Justify justifyItems_
Definition Style.h:904
float computeFlexStartPosition(FlexDirection axis, Direction direction, float axisSize) const
Definition Style.h:416
static bool sizeLengthsEqual(const std::array< StyleValueHandle, N > &lhs, const StyleValuePool &lhsPool, const std::array< StyleValueHandle, N > &rhs, const StyleValuePool &rhsPool)
Definition Style.h:729
GridTrackList gridAutoRows_
Definition Style.h:936
void setJustifySelf(Justify value)
Definition Style.h:80
bool isFlexStartPositionAuto(FlexDirection axis, Direction direction) const
Definition Style.h:382
GridLine gridRowEnd_
Definition Style.h:940
void setFlexBasis(Style::SizeLength value)
Definition Style.h:157
void setDisplay(Display value)
Definition Style.h:129
float computePaddingAndBorderForDimension(Direction direction, Dimension dimension, float widthSize) const
Definition Style.h:592
float computeFlexEndPosition(FlexDirection axis, Direction direction, float axisSize) const
Definition Style.h:434
Align alignContent() const
Definition Style.h:84
StyleValueHandle flexShrink_
Definition Style.h:918
Display display() const
Definition Style.h:126
GridLine gridColumnStart_
Definition Style.h:937
float computeGapForDimension(Dimension dimension, float ownerSize) const
Definition Style.h:623
float computeFlexEndMargin(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:470
void setGridTemplateColumnAt(size_t index, GridTrackSize value)
Definition Style.h:220
float computeGapForAxis(FlexDirection axis, float ownerSize) const
Definition Style.h:618
FloatOptional resolvedMinDimension(Direction direction, Dimension axis, float referenceLength, float ownerWidth) const
Definition Style.h:292
StyleValueHandle computeRightEdge(const Edges &edges, Direction layoutDirection) const
Definition Style.h:789
float computeInlineStartPosition(FlexDirection axis, Direction direction, float axisSize) const
Definition Style.h:424
FloatOptional resolvedMaxDimension(Direction direction, Dimension axis, float referenceLength, float ownerWidth) const
Definition Style.h:321
float computeMarginForAxis(FlexDirection axis, float widthSize) const
Definition Style.h:611
void setGridColumnEnd(GridLine value)
Definition Style.h:274
bool isFlexEndPositionDefined(FlexDirection axis, Direction direction) const
Definition Style.h:398
GridTrackList gridTemplateColumns_
Definition Style.h:933
FloatOptional flex() const
Definition Style.h:133
void setBoxSizing(BoxSizing value)
Definition Style.h:357
BoxSizing boxSizing() const
Definition Style.h:354
float computeInlineStartMargin(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:460
void resizeGridAutoColumns(size_t count)
Definition Style.h:243
bool isFlexEndPositionAuto(FlexDirection axis, Direction direction) const
Definition Style.h:402
void setGap(Gutter gutter, Style::Length value)
Definition Style.h:192
Justify justifySelf_
Definition Style.h:905
void setFlexDirection(FlexDirection value)
Definition Style.h:59
bool inlineStartMarginIsAuto(FlexDirection axis, Direction direction) const
Definition Style.h:637
const GridLine & gridColumnEnd() const
Definition Style.h:271
Style::SizeLength dimension(Dimension axis) const
Definition Style.h:196
void setGridTemplateColumns(GridTrackList value)
Definition Style.h:214
bool isFlexStartPositionDefined(FlexDirection axis, Direction direction) const
Definition Style.h:377
Overflow overflow() const
Definition Style.h:119
float computeBorderForAxis(FlexDirection axis) const
Definition Style.h:606
float computeFlexEndPadding(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:538
void setGridAutoRows(GridTrackList value)
Definition Style.h:253
Align alignItems() const
Definition Style.h:91
void setAlignSelf(Align value)
Definition Style.h:101
const GridTrackList & gridTemplateRows() const
Definition Style.h:224
Wrap flexWrap_
Definition Style.h:911
Edges padding_
Definition Style.h:922
void setMinDimension(Dimension axis, Style::SizeLength value)
Definition Style.h:206
std::array< StyleValueHandle, ordinalCount< Dimension >()> Dimensions
Definition Style.h:681
void setGridAutoRowAt(size_t index, GridTrackSize value)
Definition Style.h:259
void setJustifyContent(Justify value)
Definition Style.h:66
Align alignContent_
Definition Style.h:906
Justify justifySelf() const
Definition Style.h:77
StyleValueHandle computeBottomEdge(const Edges &edges) const
Definition Style.h:808
StyleValueHandle computeTopEdge(const Edges &edges) const
Definition Style.h:779
Display display_
Definition Style.h:913
bool flexStartMarginIsAuto(FlexDirection axis, Direction direction) const
Definition Style.h:629
void setMaxDimension(Dimension axis, Style::SizeLength value)
Definition Style.h:317
Edges position_
Definition Style.h:921
void setGridTemplateRowAt(size_t index, GridTrackSize value)
Definition Style.h:233
const GridTrackList & gridAutoColumns() const
Definition Style.h:237
float computeInlineStartBorder(FlexDirection axis, Direction direction) const
Definition Style.h:494
FloatOptional flexShrink() const
Definition Style.h:147
void setOverflow(Overflow value)
Definition Style.h:122
float computeFlexStartPaddingAndBorder(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:568
Edges margin_
Definition Style.h:920
StyleValueHandle flexBasis_
Definition Style.h:919
std::array< StyleValueHandle, ordinalCount< Edge >()> Edges
Definition Style.h:682
bool isInlineEndPositionAuto(FlexDirection axis, Direction direction) const
Definition Style.h:412
Justify justifyContent() const
Definition Style.h:63
bool horizontalInsetsDefined() const
Definition Style.h:361
float computeFlexEndPaddingAndBorder(FlexDirection axis, Direction direction, float widthSize) const
Definition Style.h:584
Gutters gap_
Definition Style.h:924
GridTrackList gridAutoColumns_
Definition Style.h:935
void setPositionType(PositionType value)
Definition Style.h:108
void setGridAutoColumns(GridTrackList value)
Definition Style.h:240
const GridTrackList & gridAutoRows() const
Definition Style.h:250
Align alignSelf_
Definition Style.h:908
Style::Length position(Edge edge) const
Definition Style.h:168
GridTrackList gridTemplateRows_
Definition Style.h:934
StyleValueHandle computeBorder(PhysicalEdge edge, Direction direction) const
Definition Style.h:865
const GridTrackList & gridTemplateColumns() const
Definition Style.h:211
void setGridColumnStart(GridLine value)
Definition Style.h:267
void setAlignContent(Align value)
Definition Style.h:87
void setAspectRatio(FloatOptional value)
Definition Style.h:346
Definition StyleLength.h:28
Definition StyleSizeLength.h:29
Definition StyleValueHandle.h:32
constexpr bool isPoint() const
Definition StyleValueHandle.h:56
constexpr bool isUndefined() const
Definition StyleValueHandle.h:40
constexpr bool isPercent() const
Definition StyleValueHandle.h:52
Definition StyleValuePool.h:28
StyleSizeLength getSize(StyleValueHandle handle) const
Definition StyleValuePool.h:87
StyleLength getLength(StyleValueHandle handle) const
Definition StyleValuePool.h:68
FloatOptional getNumber(StyleValueHandle handle) const
Definition StyleValuePool.h:112
Definition Benchmark.cpp:19
constexpr bool isDefined(std::floating_point auto value)
Definition Comparison.h:23
PhysicalEdge inlineEndEdge(FlexDirection flexDirection, Direction direction)
Definition FlexDirection.h:94
Wrap
Definition Wrap.h:18
Justify
Definition Justify.h:18
Align
Definition Align.h:18
Direction
Definition Direction.h:18
Gutter
Definition Gutter.h:18
PhysicalEdge flexEndEdge(FlexDirection flexDirection)
Definition FlexDirection.h:68
void fatalWithMessage(const char *message)
Definition AssertFatal.cpp:18
Overflow
Definition Overflow.h:18
constexpr auto maxOrDefined(std::floating_point auto a, std::floating_point auto b)
Definition Comparison.h:35
PhysicalEdge inlineStartEdge(FlexDirection flexDirection, Direction direction)
Definition FlexDirection.h:83
PhysicalEdge flexStartEdge(FlexDirection flexDirection)
Definition FlexDirection.h:53
bool isRow(const FlexDirection flexDirection)
Definition FlexDirection.h:21
PositionType
Definition PositionType.h:18
Dimension dimension(FlexDirection flexDirection)
Definition FlexDirection.h:105
FlexDirection
Definition FlexDirection.h:18
std::vector< GridTrackSize > GridTrackList
Definition GridTrack.h:61
Edge
Definition Edge.h:18
Dimension
Definition Dimension.h:18
BoxSizing
Definition BoxSizing.h:18
Display
Definition Display.h:18
PhysicalEdge
Definition PhysicalEdge.h:14
Definition FloatOptional.h:15
constexpr bool isDefined() const
Definition FloatOptional.h:36
Definition GridLine.h:21
Definition GridTrack.h:15