blob: b8c962384ba69f48a1c13eaa28a05a0645a8ee44 [file] [log] [blame]
// 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
closed 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`.
strict 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.
strict 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`.
strict GetTypefacesByFamily(struct {
family ff.FamilyName;
}) -> (struct {
response TypefaceInfoResponse;
}) error Error;
};
closed protocol ListTypefacesIterator {
/// Returns the next chunk of `TypefaceInfo` for all typefaces that match
/// the bound `ListTypefacesRequest`. If `response.results` is empty, no
/// results remain.
strict 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;
};