// Copyright 2016 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 deprecated and will soon be removed in favor of provider.fidl.

library fuchsia.fonts;

using fuchsia.mem;

/// Deprecated. See `GenericFontFamily`.
[Transitional]
enum FallbackGroup {
    NONE = 0;
    SERIF = 1;
    SANS_SERIF = 2;
    MONOSPACE = 3;
    CURSIVE = 4;
    FANTASY = 5;
};

/// 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;

/// 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: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.
    uint32 width = 5;

    Slant slant = Slant.UPRIGHT;

    /// 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.
    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.
    FallbackGroup fallback_group = FallbackGroup.NONE;

    uint32 flags = 0;
};

resource 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.
    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).
    uint32 font_index;
};

/// Deprecated.
/// See `Style2`.
struct Style {
    uint32 weight;
    uint32 width;
    Slant slant;
};

/// 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: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(fxbug.dev/8903): Remove deprecated methods and move to provider.fidl.
[Discoverable]
protocol Provider {

    /// Deprecated. See `GetTypeface`.
    ///
    /// Returns font that matches specified `request`.
    GetFont(Request request) -> (Response? response);

    /// 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);

    /// Register a listener to be notified when the set of available fonts or mappings has changed.
    /// A client can register as many listeners as it wishes.
    ///
    /// To unregister, close the channel.
    RegisterFontSetEventListener(FontSetEventListener listener) -> ();
};
