1/*
2 * Copyright (C) 2007 Nicholas Shanks <contact@nickshanks.com>
3 * Copyright (C) 2008, 2013 Apple Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1.  Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 * 2.  Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15 *     its contributors may be used to endorse or promote products derived
16 *     from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include "config.h"
31#include "FontDescription.h"
32
33namespace WebCore {
34
35struct SameSizeAsFontDescription {
36    Vector<AtomicString, 1> families;
37    RefPtr<FontFeatureSettings> m_featureSettings;
38    float sizes[2];
39    // FXIME: Make them fit into one word.
40    uint32_t bitfields;
41    uint32_t bitfields2 : 8;
42};
43
44COMPILE_ASSERT(sizeof(FontDescription) == sizeof(SameSizeAsFontDescription), FontDescription_should_stay_small);
45
46FontWeight FontDescription::lighterWeight(void) const
47{
48    // FIXME: Should actually return the CSS weight corresponding to next lightest
49    // weight of the currently used font family.
50    switch (m_weight) {
51        case FontWeight100:
52        case FontWeight200:
53            return FontWeight100;
54
55        case FontWeight300:
56            return FontWeight200;
57
58        case FontWeight400:
59        case FontWeight500:
60            return FontWeight300;
61
62        case FontWeight600:
63        case FontWeight700:
64            return FontWeight400;
65
66        case FontWeight800:
67            return FontWeight500;
68
69        case FontWeight900:
70            return FontWeight700;
71    }
72    ASSERT_NOT_REACHED();
73    return FontWeightNormal;
74}
75
76FontWeight FontDescription::bolderWeight(void) const
77{
78    // FIXME: Should actually return the CSS weight corresponding to next heaviest
79    // weight of the currently used font family.
80    switch (m_weight) {
81        case FontWeight100:
82        case FontWeight200:
83            return FontWeight300;
84
85        case FontWeight300:
86            return FontWeight400;
87
88        case FontWeight400:
89        case FontWeight500:
90            return FontWeight700;
91
92        case FontWeight600:
93        case FontWeight700:
94            return FontWeight800;
95
96        case FontWeight800:
97        case FontWeight900:
98            return FontWeight900;
99    }
100    ASSERT_NOT_REACHED();
101    return FontWeightNormal;
102}
103
104FontTraitsMask FontDescription::traitsMask() const
105{
106    return static_cast<FontTraitsMask>((m_italic ? FontStyleItalicMask : FontStyleNormalMask)
107            | (m_smallCaps ? FontVariantSmallCapsMask : FontVariantNormalMask)
108            | (FontWeight100Mask << (m_weight - FontWeight100)));
109
110}
111
112FontDescription FontDescription::makeNormalFeatureSettings() const
113{
114    FontDescription normalDescription(*this);
115    normalDescription.setFeatureSettings(0);
116    return normalDescription;
117}
118
119} // namespace WebCore
120