Skip to content

Commit fedbfca

Browse files
committedJan 22, 2025·
Add support for design space segments to font2ift.
1 parent bf8ef54 commit fedbfca

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed
 

‎util/encoder_config.proto

+7-1
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,11 @@ message Features {
169169

170170
// A variable font design space.
171171
message DesignSpace {
172-
// TODO(garretrieger): add structure
172+
// Map from axis tag to range on that axis.
173+
map<string, AxisRange> ranges = 1;
174+
}
175+
176+
message AxisRange {
177+
float start = 1;
178+
float end = 2;
173179
}

‎util/font2ift.cc

+22-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "absl/flags/parse.h"
1212
#include "absl/status/statusor.h"
1313
#include "absl/strings/str_cat.h"
14+
#include "common/axis_range.h"
1415
#include "common/font_data.h"
1516
#include "hb.h"
1617
#include "ift/encoder/encoder.h"
@@ -123,7 +124,7 @@ int write_output(const Encoder& encoder, const FontData& base_font) {
123124
}
124125

125126
template <typename T>
126-
flat_hash_set<uint32_t> values(T proto_set) {
127+
flat_hash_set<uint32_t> values(const T& proto_set) {
127128
flat_hash_set<uint32_t> result;
128129
for (uint32_t v : proto_set.values()) {
129130
result.insert(v);
@@ -132,14 +133,23 @@ flat_hash_set<uint32_t> values(T proto_set) {
132133
}
133134

134135
template <typename T>
135-
btree_set<hb_tag_t> tag_values(T proto_set) {
136+
btree_set<hb_tag_t> tag_values(const T& proto_set) {
136137
btree_set<hb_tag_t> result;
137138
for (const auto& tag : proto_set.values()) {
138139
result.insert(FontHelper::ToTag(tag));
139140
}
140141
return result;
141142
}
142143

144+
StatusOr<Encoder::design_space_t> to_design_space(const DesignSpace& proto) {
145+
Encoder::design_space_t result;
146+
for (const auto& [tag_str, range_proto] : proto.ranges()) {
147+
auto range = TRY(common::AxisRange::Range(range_proto.start(), range_proto.end()));
148+
result[FontHelper::ToTag(tag_str)] = range;
149+
}
150+
return result;
151+
}
152+
143153
Status ConfigureEncoder(EncoderConfig config, Encoder& encoder) {
144154
// First configure the glyph keyed segments, including features deps
145155
for (const auto& [id, gids] : config.glyph_segments()) {
@@ -162,17 +172,21 @@ Status ConfigureEncoder(EncoderConfig config, Encoder& encoder) {
162172
auto init_codepoints = values(config.initial_codepoints());
163173
auto init_features = tag_values(config.initial_features());
164174
auto init_segments = values(config.initial_glyph_patches());
165-
// TODO(garretrieger): support init design space too
175+
auto init_design_space = TRY(to_design_space(config.initial_design_space()));
166176

167177
if ((!init_codepoints.empty() || !init_features.empty()) &&
168178
init_segments.empty()) {
169179
Encoder::SubsetDefinition base_subset;
170180
base_subset.codepoints = init_codepoints;
171181
base_subset.feature_tags = init_features;
182+
base_subset.design_space = init_design_space;
172183
TRYV(encoder.SetBaseSubsetFromDef(base_subset));
173-
} else if (init_codepoints.empty() && init_features.empty() &&
184+
} else if (init_codepoints.empty() && init_features.empty() && init_design_space.empty() &&
174185
!init_segments.empty()) {
175186
TRYV(encoder.SetBaseSubsetFromSegments(init_segments));
187+
} else if (init_codepoints.empty() && init_features.empty() && !init_design_space.empty() &&
188+
!init_segments.empty()) {
189+
TRYV(encoder.SetBaseSubsetFromSegments(init_segments, init_design_space));
176190
} else {
177191
return absl::UnimplementedError(
178192
"Setting base subset from both codepoints and glyph patches is not yet "
@@ -188,7 +202,10 @@ Status ConfigureEncoder(EncoderConfig config, Encoder& encoder) {
188202
encoder.AddFeatureGroupSegment(tag_values(features));
189203
}
190204

191-
// TODO(garretrieger): support design space.
205+
for (const auto& design_space_proto : config.non_glyph_design_space_segmentation()) {
206+
auto design_space = TRY(to_design_space(design_space_proto));
207+
encoder.AddDesignSpaceSegment(design_space);
208+
}
192209

193210
for (const auto& segments : config.glyph_patch_groupings()) {
194211
TRYV(encoder.AddNonGlyphSegmentFromGlyphSegments(values(segments)));

0 commit comments

Comments
 (0)
Please sign in to comment.