| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // NOTE: This file is unstable and should not be depended on. |
| // TODO(seancuff): Convert doc comments to markdown. |
| |
| library fuchsia.fonts.experimental; |
| |
| using fuchsia.fonts as ff; |
| using fuchsia.intl; |
| |
| /// The maximum number of font families that can be returned in a |
| /// `TypefaceInfoResponse`. |
| const MAX_TYPEFACE_RESULTS uint32 = 16; |
| |
| type Error = strict enum { |
| NOT_FOUND = 1; |
| INTERNAL = 2; |
| }; |
| |
| /// Experimental additions to `Provider`. |
| @discoverable |
| protocol Provider { |
| /// Get an exact font by asset ID. This would typically be called |
| /// after `ListTypefaces`, e.g. as part of a font selection interface. |
| /// As with `fuchsia.fonts.GetTypeface`, it is the caller's responsibility |
| /// to properly parse the file. |
| /// |
| /// Possible errors: |
| /// `NOT_FOUND` if no asset with the requested `id` exists. |
| /// `INTERNAL` if the requested `id` exists, but the asset failed to load. |
| /// |
| /// Eventually this should probably be folded into `GetTypeface`. |
| GetTypefaceById(struct { |
| id uint32; |
| }) -> (resource struct { |
| response ff.TypefaceResponse; |
| }) error Error; |
| |
| /// Creates a `ListTypefacesIterator` instance that will return a paginated |
| /// list of fonts matching `request`. |
| /// |
| /// Possible errors: |
| /// `INTERNAL` if something bad happens. |
| ListTypefaces(resource struct { |
| request ListTypefacesRequest; |
| iterator server_end:ListTypefacesIterator; |
| }) -> () error Error; |
| |
| /// Returns a `TypefaceInfo` for each font in the requested `family`. The |
| /// results' `family` fields will hold the canonical family name, even if |
| /// this method is called with an alias. |
| /// |
| /// This method should be called only if the caller knows `family` exists. |
| /// Requesting a family that does not exist results in an error. To search |
| /// for fonts by family name (or alias), use `ListTypefaces` instead. |
| /// |
| /// Possible errors: |
| /// `NOT_FOUND` if no family name or alias matches the requested `family`. |
| GetTypefacesByFamily(struct { |
| family ff.FamilyName; |
| }) -> (struct { |
| response TypefaceInfoResponse; |
| }) error Error; |
| }; |
| |
| protocol ListTypefacesIterator { |
| /// Returns the next chunk of `TypefaceInfo` for all typefaces that match |
| /// the bound `ListTypefacesRequest`. If `response.results` is empty, no |
| /// results remain. |
| GetNext() -> (struct { |
| response TypefaceInfoResponse; |
| }); |
| }; |
| |
| /// Query parameters for `ListTypefaces`. Results must match all included |
| /// fields. All fields are optional; omitted fields will match any font. |
| type ListTypefacesRequest = table { |
| /// Optional flags to modify matching behavior. Ignored if no other fields |
| /// are set. |
| 1: flags ListTypefacesFlags; |
| |
| /// The name or alias of a font family. By default, families whose name |
| /// exactly matches `family`. For substring matching, set the request's |
| /// `MATCH_FAMILY_NAME_SUBSTRING` flag. |
| 2: family ff.FamilyName; |
| |
| /// Results must have a slant within this inclusive range. |
| 3: slant SlantRange; |
| |
| /// Results must have a weight within this inclusive range. |
| 4: weight WeightRange; |
| |
| /// Results must have a width within this inclusive range. |
| 5: width WidthRange; |
| |
| /// Languages that results must support. |
| /// Each result must support all requested languages. |
| 6: languages vector<fuchsia.intl.LocaleId>:ff.MAX_FACE_QUERY_LANGUAGES; |
| |
| /// Code points that results must include. |
| /// Each result must include all requested code points. |
| 7: code_points vector<uint32>; |
| |
| /// Generic font family which results must belong to. If a font's generic |
| /// family is not set, it will only be matched if this field is also not |
| /// set. However, omitting this field will still cause it to match any font. |
| 8: generic_family ff.GenericFontFamily; |
| }; |
| |
| type ListTypefacesFlags = strict bits : uint32 { |
| /// Match families whose name or alias exactly contains the requested |
| /// `FamilyName`. If not set, match families whose name or alias exactly |
| /// matches `FamilyName`. |
| /// |
| /// Note: Matching will always ignore case. |
| MATCH_FAMILY_NAME_SUBSTRING = 0x00000001; |
| }; |
| |
| /// Represents a range of acceptable `Slant`s. Both bounds are inclusive. |
| type SlantRange = struct { |
| lower ff.Slant; |
| upper ff.Slant; |
| }; |
| |
| /// Represents a range of acceptable `Weight`s. Both bounds are inclusive. |
| type WeightRange = struct { |
| lower ff.Weight; |
| upper ff.Weight; |
| }; |
| |
| /// Represents a range of acceptable `Width`s. Both bounds are inclusive. |
| type WidthRange = struct { |
| lower ff.Width; |
| upper ff.Width; |
| }; |
| |
| type TypefaceInfoResponse = table { |
| 1: results vector<TypefaceInfo>:MAX_TYPEFACE_RESULTS; |
| }; |
| |
| /// Collection of typeface metadata that should be sufficient for clients to |
| /// perform some kind of selection (likely via human) and request an exact font. |
| type TypefaceInfo = table { |
| /// Identifier for the font asset. This ID is valid for the lifetime of the |
| /// font service. May be used in conjunction with `font_index` to directly |
| /// request this font. |
| 1: asset_id uint32; |
| |
| /// Index of the font within its parent asset. May be used in conjunction |
| /// with `asset_id` to directly request this font. |
| 2: font_index uint32; |
| |
| 3: family ff.FamilyName; |
| 4: style ff.Style2; |
| 5: languages vector<fuchsia.intl.LocaleId>; |
| 6: generic_family ff.GenericFontFamily; |
| }; |