1/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkFontAgruments_DEFINED
9#define SkFontAgruments_DEFINED
10
11#include "SkScalar.h"
12#include "SkTypes.h"
13
14/** Represents a set of actual arguments for a font. */
15struct SkFontArguments {
16    struct VariationPosition {
17        struct Coordinate {
18            SkFourByteTag axis;
19            SkScalar value;
20        };
21        const Coordinate* coordinates;
22        int coordinateCount;
23    };
24    // deprecated, use VariationCoordinate instead
25    struct Axis {
26       SkFourByteTag fTag;
27       SkScalar fStyleValue;
28    };
29
30    SkFontArguments() : fCollectionIndex(0), fVariationDesignPosition{nullptr, 0} {}
31
32    /** Specify the index of the desired font.
33     *
34     *  Font formats like ttc, dfont, cff, cid, pfr, t42, t1, and fon may actually be indexed
35     *  collections of fonts.
36     */
37    SkFontArguments& setCollectionIndex(int collectionIndex) {
38        fCollectionIndex = collectionIndex;
39        return *this;
40    }
41
42    // deprecated, use setVariationDesignPosition instead.
43    SkFontArguments& setAxes(const Axis* axes, int axisCount) {
44        fVariationDesignPosition.coordinates =
45                reinterpret_cast<const VariationPosition::Coordinate*>(axes);
46        fVariationDesignPosition.coordinateCount = axisCount;
47        return *this;
48    }
49
50    /** Specify a position in the variation design space.
51     *
52     *  Any axis not specified will use the default value.
53     *  Any specified axis not actually present in the font will be ignored.
54     *
55     *  @param position not copied. The value must remain valid for life of SkFontArguments.
56     */
57    SkFontArguments& setVariationDesignPosition(VariationPosition position) {
58        fVariationDesignPosition.coordinates = position.coordinates;
59        fVariationDesignPosition.coordinateCount = position.coordinateCount;
60        return *this;
61    }
62
63    int getCollectionIndex() const {
64        return fCollectionIndex;
65    }
66    // deprecated, use getVariationDesignPosition instead.
67    const Axis* getAxes(int* axisCount) const {
68        *axisCount = fVariationDesignPosition.coordinateCount;
69        return reinterpret_cast<const Axis*>(fVariationDesignPosition.coordinates);
70    }
71    VariationPosition getVariationDesignPosition() const {
72        return fVariationDesignPosition;
73    }
74private:
75    int fCollectionIndex;
76    VariationPosition fVariationDesignPosition;
77};
78
79#endif
80