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

library fuchsia.fonts;

using fuchsia.mem;

enum Slant {
    UPRIGHT = 1;
    ITALIC = 2;
    OBLIQUE = 3;
};

enum FallbackGroup {
    NONE = 0;
    SERIF = 1;
    SANS_SERIF = 2;
    MONOSPACE = 3;
    CURSIVE = 4;
    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.
const uint32 REQUEST_FLAG_NO_FALLBACK = 1;

// Disables approximate style matching. The service will only return font that
// matches the requested style exactly.
const uint32 REQUEST_FLAG_EXACT_MATCH = 2;

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

    uint32 flags = 0;
};

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

struct Style {
    uint32 weight;
    uint32 width;
    Slant slant;
};

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

[Discoverable]
interface Provider {
    // Returns font that matches specified |request|.
    1: 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".
    2: GetFamilyInfo(string:128 family) -> (FamilyInfo? family_info);
};
