/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkFontAgruments_DEFINED
#define SkFontAgruments_DEFINED

#include "SkScalar.h"
#include "SkTypes.h"

/** Represents a set of actual arguments for a font. */
struct SkFontArguments {
    struct VariationPosition {
        struct Coordinate {
            SkFourByteTag axis;
            SkScalar value;
        };
        const Coordinate* coordinates;
        int coordinateCount;
    };
    // deprecated, use VariationCoordinate instead
    struct Axis {
       SkFourByteTag fTag;
       SkScalar fStyleValue;
    };

    SkFontArguments() : fCollectionIndex(0), fVariationDesignPosition{nullptr, 0} {}

    /** Specify the index of the desired font.
     *
     *  Font formats like ttc, dfont, cff, cid, pfr, t42, t1, and fon may actually be indexed
     *  collections of fonts.
     */
    SkFontArguments& setCollectionIndex(int collectionIndex) {
        fCollectionIndex = collectionIndex;
        return *this;
    }

    // deprecated, use setVariationDesignPosition instead.
    SkFontArguments& setAxes(const Axis* axes, int axisCount) {
        fVariationDesignPosition.coordinates =
                reinterpret_cast<const VariationPosition::Coordinate*>(axes);
        fVariationDesignPosition.coordinateCount = axisCount;
        return *this;
    }

    /** Specify a position in the variation design space.
     *
     *  Any axis not specified will use the default value.
     *  Any specified axis not actually present in the font will be ignored.
     *
     *  @param position not copied. The value must remain valid for life of SkFontArguments.
     */
    SkFontArguments& setVariationDesignPosition(VariationPosition position) {
        fVariationDesignPosition.coordinates = position.coordinates;
        fVariationDesignPosition.coordinateCount = position.coordinateCount;
        return *this;
    }

    int getCollectionIndex() const {
        return fCollectionIndex;
    }
    // deprecated, use getVariationDesignPosition instead.
    const Axis* getAxes(int* axisCount) const {
        *axisCount = fVariationDesignPosition.coordinateCount;
        return reinterpret_cast<const Axis*>(fVariationDesignPosition.coordinates);
    }
    VariationPosition getVariationDesignPosition() const {
        return fVariationDesignPosition;
    }
private:
    int fCollectionIndex;
    VariationPosition fVariationDesignPosition;
};

#endif
