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
125126template <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
134135template <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+
143153Status 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