1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef MINIKIN_FONT_STYLE_H
18#define MINIKIN_FONT_STYLE_H
19
20namespace minikin {
21
22// FontStyle represents style information.
23class FontStyle {
24public:
25    enum class Weight : uint16_t {
26        THIN = 100,
27        EXTRA_LIGHT = 200,
28        LIGHT = 300,
29        NORMAL = 400,
30        MEDIUM = 500,
31        SEMI_BOLD = 600,
32        BOLD = 700,
33        EXTRA_BOLD = 800,
34        BLACK = 900,
35        EXTRA_BLACK = 1000,
36    };
37
38    enum class Slant : bool {
39        ITALIC = true,
40        UPRIGHT = false,
41    };
42
43    constexpr FontStyle() : FontStyle(Weight::NORMAL, Slant::UPRIGHT) {}
44    constexpr explicit FontStyle(Weight weight) : FontStyle(weight, Slant::UPRIGHT) {}
45    constexpr explicit FontStyle(Slant slant) : FontStyle(Weight::NORMAL, slant) {}
46    constexpr FontStyle(Weight weight, Slant slant)
47            : FontStyle(static_cast<uint16_t>(weight), slant) {}
48    constexpr FontStyle(uint16_t weight, Slant slant) : mWeight(weight), mSlant(slant) {}
49
50    constexpr uint16_t weight() const { return mWeight; }
51    constexpr Slant slant() const { return mSlant; }
52
53    constexpr bool operator==(const FontStyle& other) const {
54        return weight() == other.weight() && slant() == other.slant();
55    }
56
57    constexpr uint32_t identifier() const {
58        return (static_cast<uint32_t>(weight()) << 16) | static_cast<uint32_t>(slant());
59    }
60
61private:
62    uint16_t mWeight;
63    Slant mSlant;
64};
65
66}  // namespace minikin
67
68#endif  // MINIKIN_FONT_STYLE_H
69