31 auto makeSystemFont = [](
float size) -> CTFontRef {
33 return CTFontCreateUIFontForLanguage(kCTFontUIFontSystem, size,
nullptr);
38 buffer[0] = (tag & 0xff000000) >> 24;
39 buffer[1] = (tag & 0xff0000) >> 16;
40 buffer[2] = (tag & 0xff00) >> 8;
43 return std::string(
buffer);
69 const int originalPositionCount = typeface->getVariationDesignPosition(
nullptr, 0);
70 std::vector<Coordinate> originalPosition(originalPositionCount);
71 const int retrievedOriginalPositionCount =
72 typeface->getVariationDesignPosition(originalPosition.data(), originalPosition.size());
73 if (!(retrievedOriginalPositionCount == originalPositionCount)) {
84 for (
auto& originalCoordinate : originalPosition) {
85 SkMaybeDebugf(
"(%s: %f) ", tagToString(originalCoordinate.axis).c_str(),
86 originalCoordinate.value);
90 const int originalAxisCount = typeface->getVariationDesignParameters(
nullptr, 0);
91 std::vector<Axis> originalAxes(originalAxisCount);
92 const int returnedOriginalAxisCount =
93 typeface->getVariationDesignParameters(originalAxes.data(), originalAxes.size());
94 if (!(returnedOriginalAxisCount == originalAxisCount)) {
99 for (
bool omitOpsz : {
false,
true}) {
100 for (
SkFourByteTag axisToBump : { 0u, kOpszTag, kWdthTag, kGRADTag }) {
101 for (
float testCoordinate : {100, 300, 400, 500, 700, 900}) {
102 std::vector<Coordinate> expectedPosition;
103 std::vector<Coordinate> requestPosition;
105 for (
auto& originalCoordinate : originalPosition) {
106 float requestValue = originalCoordinate.value;
107 if (originalCoordinate.axis == kOpszTag && omitOpsz) {
108 SkMaybeDebugf(
"#%s: %f# ", tagToString(originalCoordinate.axis).c_str(),
111 if (originalCoordinate.axis == axisToBump) {
115 requestValue += requestValue / 1024.0f;
117 if (originalCoordinate.axis == kWghtTag) {
118 requestValue = testCoordinate;
120 SkMaybeDebugf(
"(%s: %f) ", tagToString(originalCoordinate.axis).c_str(),
122 requestPosition.push_back({originalCoordinate.axis, requestValue});
125 float expectedValue = requestValue;
126 for (
auto& originalAxis : originalAxes) {
127 if (originalAxis.tag == originalCoordinate.axis) {
128 expectedValue = std::min(expectedValue, originalAxis.max);
129 expectedValue = std::max(expectedValue, originalAxis.min);
132 expectedPosition.push_back({originalCoordinate.axis, expectedValue});
137 for (
auto& expectedCoordinate : expectedPosition) {
138 SkMaybeDebugf(
"(%s: %f) ", tagToString(expectedCoordinate.axis).c_str(),
139 expectedCoordinate.value);
144 { requestPosition.data(), (
int)requestPosition.size() };
146 typeface->makeClone(
SkFontArguments().setVariationDesignPosition(variationPosition)));
148 const int cloneAxisCount = cloneTypeface->getVariationDesignPosition(
nullptr, 0);
149 std::vector<Coordinate> clonePosition(cloneAxisCount);
150 const int retrievedCloneAxisCount =
151 cloneTypeface->getVariationDesignPosition(clonePosition.data(), clonePosition.size());
152 if (!(retrievedCloneAxisCount == cloneAxisCount)) {
158 for (
auto& cloneCoordinate : clonePosition) {
159 SkMaybeDebugf(
"(%s: %f) ", tagToString(cloneCoordinate.axis).c_str(),
160 cloneCoordinate.value);
164 if (clonePosition.size() != expectedPosition.size()) {
169 auto compareCoordinate = [](
const Coordinate&
a,
const Coordinate&
b) ->
bool {
170 return a.axis <
b.axis;
172 std::sort(clonePosition.begin(), clonePosition.end(), compareCoordinate);
173 std::sort(expectedPosition.begin(), expectedPosition.end(), compareCoordinate);
174 for (
const auto&& [clone, expected] :
SkMakeZip(clonePosition, expectedPosition)) {