1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (c) Meta Platforms, Inc. and affiliates.
3//
4// SPDX-License-Identifier: MIT
5
6#include "YGConfig.h"
7
8QT_YOGA_NAMESPACE_BEGIN
9
10namespace facebook {
11namespace yoga {
12
13bool configUpdateInvalidatesLayout(QT_NAMESPACE_REF::YGConfigRef a, QT_NAMESPACE_REF::YGConfigRef b) {
14 return a->getErrata() != b->getErrata() ||
15 a->getEnabledExperiments() != b->getEnabledExperiments() ||
16 a->getPointScaleFactor() != b->getPointScaleFactor() ||
17 a->useWebDefaults() != b->useWebDefaults();
18}
19} // namespace yoga
20} // namespace facebook
21
22using namespace facebook::yoga;
23
24YGConfig::YGConfig(YGLogger logger) : cloneNodeCallback_{.withContext: nullptr} {
25 setLogger(logger);
26}
27
28void YGConfig::setUseWebDefaults(bool useWebDefaults) {
29 flags_.useWebDefaults = useWebDefaults;
30}
31
32bool YGConfig::useWebDefaults() const {
33 return flags_.useWebDefaults;
34}
35
36void YGConfig::setShouldPrintTree(bool printTree) {
37 flags_.printTree = printTree;
38}
39
40bool YGConfig::shouldPrintTree() const {
41 return flags_.printTree;
42}
43
44void YGConfig::setExperimentalFeatureEnabled(
45 YGExperimentalFeature feature,
46 bool enabled) {
47 experimentalFeatures_.set(position: feature, val: enabled);
48}
49
50bool YGConfig::isExperimentalFeatureEnabled(
51 YGExperimentalFeature feature) const {
52 return experimentalFeatures_.test(position: feature);
53}
54
55ExperimentalFeatureSet YGConfig::getEnabledExperiments() const {
56 return experimentalFeatures_;
57}
58
59void YGConfig::setErrata(YGErrata errata) {
60 errata_ = errata;
61}
62
63void YGConfig::addErrata(YGErrata errata) {
64 errata_ |= errata;
65}
66
67void YGConfig::removeErrata(YGErrata errata) {
68 errata_ &= (~errata);
69}
70
71YGErrata YGConfig::getErrata() const {
72 return errata_;
73}
74
75bool YGConfig::hasErrata(YGErrata errata) const {
76 return (errata_ & errata) != YGErrataNone;
77}
78
79void YGConfig::setPointScaleFactor(float pointScaleFactor) {
80 pointScaleFactor_ = pointScaleFactor;
81}
82
83float YGConfig::getPointScaleFactor() const {
84 return pointScaleFactor_;
85}
86
87void YGConfig::setContext(void* context) {
88 context_ = context;
89}
90
91void* YGConfig::getContext() const {
92 return context_;
93}
94
95void YGConfig::setLogger(YGLogger logger) {
96 logger_.noContext = logger;
97 flags_.loggerUsesContext = false;
98}
99
100void YGConfig::setLogger(LogWithContextFn logger) {
101 logger_.withContext = logger;
102 flags_.loggerUsesContext = true;
103}
104
105void YGConfig::setLogger(std::nullptr_t) {
106 setLogger(YGLogger{nullptr});
107}
108
109void YGConfig::log(
110 YGConfig* config,
111 YGNode* node,
112 YGLogLevel logLevel,
113 void* logContext,
114 const char* format,
115 va_list args) const {
116 if (flags_.loggerUsesContext) {
117 logger_.withContext(config, node, logLevel, logContext, format, args);
118 } else {
119 logger_.noContext(config, node, logLevel, format, args);
120 }
121}
122
123void YGConfig::setCloneNodeCallback(YGCloneNodeFunc cloneNode) {
124 cloneNodeCallback_.noContext = cloneNode;
125 flags_.cloneNodeUsesContext = false;
126}
127
128void YGConfig::setCloneNodeCallback(CloneWithContextFn cloneNode) {
129 cloneNodeCallback_.withContext = cloneNode;
130 flags_.cloneNodeUsesContext = true;
131}
132
133void YGConfig::setCloneNodeCallback(std::nullptr_t) {
134 setCloneNodeCallback(YGCloneNodeFunc{nullptr});
135}
136
137YGNodeRef YGConfig::cloneNode(
138 YGNodeRef node,
139 YGNodeRef owner,
140 int childIndex,
141 void* cloneContext) const {
142 YGNodeRef clone = nullptr;
143 if (cloneNodeCallback_.noContext != nullptr) {
144 clone = flags_.cloneNodeUsesContext
145 ? cloneNodeCallback_.withContext(node, owner, childIndex, cloneContext)
146 : cloneNodeCallback_.noContext(node, owner, childIndex);
147 }
148 if (clone == nullptr) {
149 clone = YGNodeClone(node);
150 }
151 return clone;
152}
153
154QT_YOGA_NAMESPACE_END
155

source code of qtdeclarative/src/3rdparty/yoga/YGConfig.cpp