diff --git a/garnet/bin/fonts/src/font_service.rs b/garnet/bin/fonts/src/font_service.rs index f3370b12464c961a089c7aebd09ecaf279ae47b5..4b05c21a539d186db17926df1a3431106bdd680b 100644 --- a/garnet/bin/fonts/src/font_service.rs +++ b/garnet/bin/fonts/src/font_service.rs @@ -313,6 +313,7 @@ impl FontService { fn handle_font_provider_request( &self, request: fonts::ProviderRequest, ) -> impl Future<Output = Result<(), fidl::Error>> { + #[allow(unused_variables)] match request { fonts::ProviderRequest::GetFont { request, responder } => { let mut response = self.match_request(request); @@ -322,6 +323,14 @@ impl FontService { let mut font_info = self.get_font_info(family); future::ready(responder.send(font_info.as_mut().map(OutOfLine))) } + fonts::ProviderRequest::GetTypeface { request, responder } => { + // TODO(I18N-12): Implement changes from API review + unimplemented!(); + } + fonts::ProviderRequest::GetFontFamilyInfo { family, responder } => { + // TODO(I18N-12): Implement changes from API review + unimplemented!(); + } } } } diff --git a/sdk/fidl/fuchsia.fonts/BUILD.gn b/sdk/fidl/fuchsia.fonts/BUILD.gn index a05bede021b8ecb108f96e081d30f486f4963bfe..92bc962376a60730ab99eed988ab7f9ebd680ca9 100644 --- a/sdk/fidl/fuchsia.fonts/BUILD.gn +++ b/sdk/fidl/fuchsia.fonts/BUILD.gn @@ -9,9 +9,12 @@ fidl("fuchsia.fonts") { sources = [ "font_provider.fidl", + "provider.fidl", + "styles.fidl", ] public_deps = [ + "//sdk/fidl/fuchsia.intl", "//zircon/public/fidl/fuchsia-mem", ] } diff --git a/sdk/fidl/fuchsia.fonts/font_provider.fidl b/sdk/fidl/fuchsia.fonts/font_provider.fidl index 019b6a0ee4ef38f4c2c8cb0c353dbbdd2637e03b..46704e66f2d5965c28343fcdb04db016533021ef 100644 --- a/sdk/fidl/fuchsia.fonts/font_provider.fidl +++ b/sdk/fidl/fuchsia.fonts/font_provider.fidl @@ -2,16 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// NOTE: This file is deprecated and will soon be removed in favor of provider.fidl. + library fuchsia.fonts; using fuchsia.mem; -enum Slant { - UPRIGHT = 1; - ITALIC = 2; - OBLIQUE = 3; -}; - +/// Deprecated. See |GenericFontFamily|. +[Transitional] enum FallbackGroup { NONE = 0; SERIF = 1; @@ -21,46 +19,49 @@ enum FallbackGroup { FANTASY = 5; }; -// Disables font fallback. The service won't try to search fallback font set if -// there is no requested font family or if it doesn't contain requested -// character. +/// Deprecated. See |FaceRequestFlags|. +/// Disables font fallback. The service won't try to search fallback font set if +/// there is no requested font family or if it doesn't contain requested +/// character. const uint32 REQUEST_FLAG_NO_FALLBACK = 1; -// Disables approximate style matching. The service will only return font that -// matches the requested style exactly. +/// Deprecated. See |FaceRequestFlags|. +/// Disables approximate style matching. The service will only return font that +/// matches the requested style exactly. const uint32 REQUEST_FLAG_EXACT_MATCH = 2; +/// Deprecated. See |FaceRequest|. struct Request { - // Desired font family name, e.g. "Roboto". Font family search is - // case-insensitive. In case when there is no specified family or the - // specified family doesn't have glyph for the requested |character| then - // a font from another family may be returned. This behavior can be disabled - // using REQUEST_FLAG_NO_FALLBACK. - string:128? family; - - // For example, 400 is normal, 700 is bold. + /// Desired font family name, e.g. "Roboto". Font family search is + /// case-insensitive. In case when there is no specified family or the + /// specified family doesn't have glyph for the requested |character| then + /// a font from another family may be returned. This behavior can be disabled + /// using REQUEST_FLAG_NO_FALLBACK. + string:MAX_FAMILY_NAME_LENGTH? family; + + /// For example, 400 is normal, 700 is bold. uint32 weight = 400; - // Numeric values matching OS/2 & Windows Metrics usWidthClass table. - // https://www.microsoft.com/typography/otspec/os2.htm - // For example, 5 is normal. + /// Numeric values matching OS/2 & Windows Metrics usWidthClass table. + /// https://www.microsoft.com/typography/otspec/os2.htm + /// For example, 5 is normal. uint32 width = 5; Slant slant = UPRIGHT; - // BCP47 language tags in order of preference. See - // https://tools.ietf.org/html/bcp47 . + /// BCP47 language tags in order of preference. See + /// https://tools.ietf.org/html/bcp47 . vector<string:35>:8? language; - // Codepoint for the character that must be present in the returned font or 0. - // Caller that specify this field are expected to extract character set from - // the result and cache it in order to avoid calling the API more than - // necessary. + /// Codepoint for the character that must be present in the returned font or 0. + /// Caller that specify this field are expected to extract character set from + /// the result and cache it in order to avoid calling the API more than + /// necessary. uint32 character = 0; - // Fallback group preference. Caller can leave this field set to NONE. In - // that case the font provider will use fallback group of the specified font - // family. + /// Fallback group preference. Caller can leave this field set to NONE. In + /// that case the font provider will use fallback group of the specified font + /// family. FallbackGroup fallback_group = NONE; uint32 flags = 0; @@ -69,42 +70,67 @@ struct Request { struct Response { fuchsia.mem.Buffer buffer; - // Buffer identifier for the buffer. Responses with the same buffer_id are - // guaranteed to contain the same data in the buffer. Clients may use this - // value to detect if they already have the font cached in parsed form. + /// Buffer identifier for the buffer. Responses with the same buffer_id are + /// guaranteed to contain the same data in the buffer. Clients may use this + /// value to detect if they already have the font cached in parsed form. uint32 buffer_id; - // Font index within `buffer`. Used for font formats that may contain more - // than one font per file, e.g. TTC (TrueType Collection). + /// Font index within `buffer`. Used for font formats that may contain more + /// than one font per file, e.g. TTC (TrueType Collection). uint32 font_index; }; +/// Deprecated. +/// See |Style2|. struct Style { uint32 weight; uint32 width; Slant slant; }; -// Information about font family that can be requested using GetFamilyInfo(). +/// Deprecated. See |FontFamilyInfo|. +/// +/// Information about font family that can be requested using GetFamilyInfo(). struct FamilyInfo { - // Canonical font family name. Note that this may be different from the - // value passed to GetFamilyInfo() because GetFamilyInfo() also resolves - // font aliases and ignores case. For example GetFamilyInfo("robotoslab") - // will FamilyInfo.name = "Robot Slab". - string:128 name; - - // Unordered list of all available styles in the family. - vector<Style>:300 styles; + /// Canonical font family name. Note that this may be different from the + /// value passed to GetFamilyInfo() because GetFamilyInfo() also resolves + /// font aliases and ignores case. For example GetFamilyInfo("robotoslab") + /// will FamilyInfo.name = "Robot Slab". + string:MAX_FAMILY_NAME_LENGTH name; + + /// Unordered list of all available styles in the family. + vector<Style>:MAX_FAMILY_STYLES styles; }; +/// Provider of digital font files and metadata. +/// +/// TODO(I18N-12): Remove deprecated methods and move to provider.fidl. [Discoverable] protocol Provider { - // Returns font that matches specified |request|. + + /// Deprecated. See |GetTypeface|. + /// + /// Returns font that matches specified |request|. GetFont(Request request) -> (Response? response); - // Returns information for the specified font family or null if there is - // no family with the specified name. This function respects family name - // aliases and ignores case, so request for "robotoSLAB" will return - // FamilyInfo for "Roboto Slab". - GetFamilyInfo(string:128 family) -> (FamilyInfo? family_info); + /// Deprecated. See |GetFontFamilyInfo|. + /// + /// Returns information for the specified font family or null if there is + /// no family with the specified name. This function respects family name + /// aliases and ignores case, so request for "robotoSLAB" will return + /// FamilyInfo for "Roboto Slab". + GetFamilyInfo(string:MAX_FAMILY_NAME_LENGTH family) -> (FamilyInfo? family_info); + + /// Returns a typeface that matches the specified |request|, or an empty table if no matching + /// face is found. (The latter is more likely to happen if |TypefaceRequestFlags.EXACT_FAMILY| + /// is used to disable fallbacks.) + GetTypeface(TypefaceRequest request) -> (TypefaceResponse response); + + /// Returns information for the specified font family, or an empty table if there is no family + /// with the specified name. + /// + /// This function respects family name aliases and ignores case. For example, "RobotoSlab" is an + /// alias for the canonical name "Roboto Slab". A request for "robotoSLAB" would return the + /// |FontFamilyInfo| for "Roboto Slab" due to the case-insensitivity and alias resolution. + GetFontFamilyInfo(FamilyName family) -> (FontFamilyInfo family_info); }; diff --git a/sdk/fidl/fuchsia.fonts/fuchsia.fonts.api b/sdk/fidl/fuchsia.fonts/fuchsia.fonts.api index 28ac21e9b695f549022f33e4f0bf836e3c1018d7..42dc01f499a6355b7a0a4a1e49e71bfcf50aed27 100644 --- a/sdk/fidl/fuchsia.fonts/fuchsia.fonts.api +++ b/sdk/fidl/fuchsia.fonts/fuchsia.fonts.api @@ -1,3 +1,5 @@ { - "fidl/fuchsia.fonts/font_provider.fidl": "235173cb08d4421d53c8905c0e351455" + "fidl/fuchsia.fonts/font_provider.fidl": "2d8e7878bd19c1dcb72d523d82a5db3c", + "fidl/fuchsia.fonts/provider.fidl": "442eac20007bd397686255d215d074dd", + "fidl/fuchsia.fonts/styles.fidl": "ce2944f0316e3138e7356a5659f46acd" } \ No newline at end of file diff --git a/sdk/fidl/fuchsia.fonts/provider.fidl b/sdk/fidl/fuchsia.fonts/provider.fidl new file mode 100644 index 0000000000000000000000000000000000000000..b06cb5bfc33ce69e26618a576dd6ce9a462955f7 --- /dev/null +++ b/sdk/fidl/fuchsia.fonts/provider.fidl @@ -0,0 +1,115 @@ +// 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. + +library fuchsia.fonts; + +using fuchsia.intl; +using fuchsia.mem; + +/// The maximum length of a font family name. +const uint32 MAX_FAMILY_NAME_LENGTH = 128; + +/// The maximum number of preferred languages allowed in a typeface query. +const uint32 MAX_FACE_QUERY_LANGUAGES = 8; + +/// The maximum number of styles that will be returned for a font family. +const uint32 MAX_FAMILY_STYLES = 300; + +/// The name of a family of fonts. +/// +/// Examples: "Roboto", "Noto Serif". +struct FamilyName { + /// The characters that make up the name. + string:MAX_FAMILY_NAME_LENGTH name; +}; + +/// Boolean flags for |TypefaceRequest|. +bits TypefaceRequestFlags:uint32 { + /// Disables font family fallback. The service won't try to search the fallback font set if the + /// requested font family doesn't exist or if it doesn't contain the requested code point. + EXACT_FAMILY = 0x00000001; + + /// Disables approximate style matching. The service will only return a face that matches the + /// requested style exactly. For example, there will be no substitutions of "medium" for a + /// requested "semi-bold" weight, or "oblique" for a requested "italic" slant. + EXACT_STYLE = 0x00000002; +}; + +/// Parameters for requesting a typeface. +table TypefaceRequest { + /// Parameters for looking up a typeface. + 1: TypefaceQuery query; + /// Flags for how to process the request, such as which kinds of substitutions are permitted. + 2: TypefaceRequestFlags flags; +}; + +/// Parameters for looking up a typeface. +table TypefaceQuery { + /// Desired font family name, e.g. "Roboto". Font family search ignores differences in case and + /// whitespace. + /// + /// Note: In cases where the specified family doesn't exist, or the specified family doesn't + /// have a glyph for the requested |code_point|, a face from another family may be returned. + /// This behavior can be disabled using |TypefaceRequestFlags.EXACT_FAMILY|. + 1: FamilyName family; + + /// Style properties of the desired typeface. + 2: Style2 style; + + /// Language tags in order of preference. This allows disambiguating code points that map + /// to different glyphs in different languages (e.g. CJK code points). + /// + /// See |fuchsia.intl.LocaleId|. + 3: vector<fuchsia.intl.LocaleId>:MAX_FACE_QUERY_LANGUAGES languages; + + /// Optional code point for which a glyph must be present in the returned face. + /// + /// Callers that specify this field are expected to extract the character set from the result + /// and cache it in order to avoid calling the API more than necessary. + 4: uint32 code_point; + + /// A generic font family to fall back to if an exact match is unavailable or does not contain + /// the requested code point. + /// + /// Every font family belongs to a generic family (configured in the font manifest). If a + /// particular font family doesn't contain a requested code point, the provider can search for + /// the code point in other font families _in the same generic family_ as a fallback. + /// + /// Specifying |fallback_family| in a query allows the client to override the generic family + /// that would be used as a fallback. + 5: GenericFontFamily fallback_family; +}; + +/// Response to a TypefaceRequest. Contains the digital font file and metadata corresponding to a +/// returned typeface. Clients are expected to cache the results if they plan to reuse them. +/// +/// If a matching typeface cannot be found, the table will be empty. +table TypefaceResponse { + /// A memory buffer containing the bytes of a digital font file. + /// It is the client's responsibility to identify the type of file and to parse it (usually by + /// delegating to FreeType or a similar library). + 1: fuchsia.mem.Buffer buffer; + + /// Identifier for the buffer. Responses with the same |buffer_id| are guaranteed to contain the + /// same data in the buffer. Clients may use this value to detect if they already have the font + /// cached in parsed form. + 2: uint32 buffer_id; + + /// Index of the returned typeface within `buffer`. Used for digital font formats that may + /// contain more than one typeface per file, e.g. TTC (TrueType Collection). + 3: uint32 font_index; +}; + +/// Information about a font family that can be requested using |Provider.GetFontFamilyInfo()|. +/// +/// If a matching font family is not found, the table will be empty. +table FontFamilyInfo { + /// Canonical font family name. Note that this may be different from the value passed to + /// |GetFontFamilyInfo()| due to the resolution of font aliases, and/or differences in + /// whitespace and capitalization. + 1: FamilyName name; + + /// Unordered list of all available styles in the family. + 2: vector<Style>:MAX_FAMILY_STYLES styles; +}; diff --git a/sdk/fidl/fuchsia.fonts/styles.fidl b/sdk/fidl/fuchsia.fonts/styles.fidl new file mode 100644 index 0000000000000000000000000000000000000000..d7e62ca36a242bd2792d1faa409ee17e8d81333d --- /dev/null +++ b/sdk/fidl/fuchsia.fonts/styles.fidl @@ -0,0 +1,99 @@ +// 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. + +library fuchsia.fonts; + +using Weight = uint16; + +// Commonly used constants for font weight. +const uint16 WEIGHT_THIN = 100; +const uint16 WEIGHT_EXTRA_LIGHT = 200; +const uint16 WEIGHT_LIGHT = 300; +const uint16 WEIGHT_NORMAL = 400; +const uint16 WEIGHT_MEDIUM = 500; +const uint16 WEIGHT_SEMI_BOLD = 600; +const uint16 WEIGHT_BOLD = 700; +const uint16 WEIGHT_EXTRA_BOLD = 800; +const uint16 WEIGHT_BLACK = 900; + +/// The type of slant of a type face. +enum Slant { + /// The default; upright glyphs. + UPRIGHT = 1; + /// Specially designed, slanted and slightly calligraphic glyphs. + ITALIC = 2; + /// Skewed glyphs. Oblique usually means an geometric transformation of the upright variant, + /// rather than a custom-designed variant. + OBLIQUE = 3; +}; + +/// Horizontal width class of the glyphs. +/// +/// See https://docs.microsoft.com/en-us/typography/opentype/spec/os2#uswidthclass. +enum Width { + /// 50% of normal width + ULTRA_CONDENSED = 1; + /// 62.5% of normal width + EXTRA_CONDENSED = 2; + /// 75% of normal width + CONDENSED = 3; + /// 87.5% of normal width + SEMI_CONDENSED = 4; + /// Normal width + NORMAL = 5; + /// 112.5% of normal width + SEMI_EXPANDED = 6; + /// 125% of normal width + EXPANDED = 7; + /// 150% of normal width + EXTRA_EXPANDED = 8; + /// 200% of normal width + ULTRA_EXPANDED = 9; +}; + +/// Style properties that can be used when requesting or describing a type face. +table Style2 { + /// See |Slant|. + 1: Slant slant; + /// Weight or thickness of the glyphs. Allowed values are integers in the range [1, 1000], but + /// most real-world font families only support some integer multiples of 100: + /// {100, 200, ..., 900}. Normal text (|WEIGHT_NORMAL|) is 400; |WEIGHT_BOLD| is 700. + /// + /// See: + /// https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#Common_weight_name_mapping + /// https://docs.microsoft.com/en-us/typography/opentype/spec/os2#usweightclass + 2: Weight weight; + /// See |Width|. + 3: Width width; +}; + +/// Generic groups of font families that can serve as fallbacks for a specific family. +/// +/// Every font family belongs to some _generic_ font family (see examples below). +/// +/// If an exact requested family is unavailable but a fallback group is specified in the request, +/// the provider may return some other family that belongs to the fallback group. For example, if +/// the client requests the "Arial" family with a |SANS_SERIF| fallback, and "Arial" is unavailable, +/// the provider may return another available sans serif family, such as "Roboto Regular", instead. +/// +/// See also: +/// https://www.w3.org/Style/Examples/007/fonts.en.html +/// https://developer.mozilla.org/en-US/docs/Web/CSS/font-family#Values +enum GenericFontFamily { + /// Glyphs have little "serifs", hooks, or notches at the ends of most strokes. + /// Examples: Georgia, Noto Serif, Times New Roman. + SERIF = 1; + /// Glyphs that have no serifs at the ends of most strokes. + /// Examples: Arial, Noto Sans, Roboto, Tahoma. + SANS_SERIF = 2; + /// Fixed-width fonts. + /// Examples: Consolas, Courier New, Inconsolata. + MONOSPACE = 3; + /// Handwritten or cursive fonts. + /// Examples: Brush Script, Comic Sans, Lucida Calligraphy. + CURSIVE = 4; + /// Decorative fonts. + /// Examples: Impact, Papyrus. + FANTASY = 5; +};