1538122d159ef845767ea430a5541248e85e43717Seigo Nonaka/*
2538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * Copyright (C) 2017 The Android Open Source Project
3538122d159ef845767ea430a5541248e85e43717Seigo Nonaka *
4538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
5538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * you may not use this file except in compliance with the License.
6538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * You may obtain a copy of the License at
7538122d159ef845767ea430a5541248e85e43717Seigo Nonaka *
8538122d159ef845767ea430a5541248e85e43717Seigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
9538122d159ef845767ea430a5541248e85e43717Seigo Nonaka *
10538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * Unless required by applicable law or agreed to in writing, software
11538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
12538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * See the License for the specific language governing permissions and
14538122d159ef845767ea430a5541248e85e43717Seigo Nonaka * limitations under the License.
15538122d159ef845767ea430a5541248e85e43717Seigo Nonaka */
16538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
17538122d159ef845767ea430a5541248e85e43717Seigo Nonaka#ifndef MINIKIN_FONT_STYLE_H
18538122d159ef845767ea430a5541248e85e43717Seigo Nonaka#define MINIKIN_FONT_STYLE_H
19538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
20538122d159ef845767ea430a5541248e85e43717Seigo Nonakanamespace minikin {
21538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
22538122d159ef845767ea430a5541248e85e43717Seigo Nonaka// FontStyle represents style information.
23538122d159ef845767ea430a5541248e85e43717Seigo Nonakaclass FontStyle {
24538122d159ef845767ea430a5541248e85e43717Seigo Nonakapublic:
25538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    enum class Weight : uint16_t {
266c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        THIN = 100,
27538122d159ef845767ea430a5541248e85e43717Seigo Nonaka        EXTRA_LIGHT = 200,
286c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        LIGHT = 300,
296c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        NORMAL = 400,
306c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        MEDIUM = 500,
316c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        SEMI_BOLD = 600,
326c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        BOLD = 700,
336c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        EXTRA_BOLD = 800,
346c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        BLACK = 900,
35538122d159ef845767ea430a5541248e85e43717Seigo Nonaka        EXTRA_BLACK = 1000,
36538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    };
37538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
38538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    enum class Slant : bool {
396c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka        ITALIC = true,
40538122d159ef845767ea430a5541248e85e43717Seigo Nonaka        UPRIGHT = false,
41538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    };
42538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
43538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr FontStyle() : FontStyle(Weight::NORMAL, Slant::UPRIGHT) {}
44538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr explicit FontStyle(Weight weight) : FontStyle(weight, Slant::UPRIGHT) {}
45538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr explicit FontStyle(Slant slant) : FontStyle(Weight::NORMAL, slant) {}
46538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr FontStyle(Weight weight, Slant slant)
47538122d159ef845767ea430a5541248e85e43717Seigo Nonaka            : FontStyle(static_cast<uint16_t>(weight), slant) {}
48538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr FontStyle(uint16_t weight, Slant slant) : mWeight(weight), mSlant(slant) {}
49538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
50538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr uint16_t weight() const { return mWeight; }
51538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr Slant slant() const { return mSlant; }
52538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
53538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr bool operator==(const FontStyle& other) const {
54538122d159ef845767ea430a5541248e85e43717Seigo Nonaka        return weight() == other.weight() && slant() == other.slant();
55538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    }
56538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
57538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    constexpr uint32_t identifier() const {
58538122d159ef845767ea430a5541248e85e43717Seigo Nonaka        return (static_cast<uint32_t>(weight()) << 16) | static_cast<uint32_t>(slant());
59538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    }
60538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
61538122d159ef845767ea430a5541248e85e43717Seigo Nonakaprivate:
62538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    uint16_t mWeight;
63538122d159ef845767ea430a5541248e85e43717Seigo Nonaka    Slant mSlant;
64538122d159ef845767ea430a5541248e85e43717Seigo Nonaka};
65538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
66538122d159ef845767ea430a5541248e85e43717Seigo Nonaka}  // namespace minikin
67538122d159ef845767ea430a5541248e85e43717Seigo Nonaka
68538122d159ef845767ea430a5541248e85e43717Seigo Nonaka#endif  // MINIKIN_FONT_STYLE_H
69