db145ba7e41c7a349e93065d87f147f23c549a27
[WebKit-https.git] / WebCore / platform / FontDescription.h
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2003-6 Apple Computer, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIother.m_  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USm_
21  *
22  */
23
24 #ifndef FontDescription_h
25 #define FontDescription_h
26
27 #include "FontFamily.h"
28
29 namespace WebCore {
30
31 const unsigned cNormalWeight = 50;
32 const unsigned cBoldWeight = 63;
33
34 enum FontStretch {
35     FontStretchCondensed = 3,
36     FontStretchNormal = 5,
37     FontStretchExpanded = 7
38 };
39
40 class FontDescription {
41 public:
42     enum GenericFamilyType { NoFamily, StandardFamily, SerifFamily, SansSerifFamily, 
43                              MonospaceFamily, CursiveFamily, FantasyFamily };
44
45     FontDescription()
46         : m_specifiedSize(0), m_computedSize(0), 
47           m_italic(false), m_smallCaps(false), m_isAbsoluteSize(false), m_weight(cNormalWeight), 
48           m_stretch(FontStretchNormal), m_genericFamily(NoFamily), m_usePrinterFont(false), m_keywordSize(0)
49           {}
50     
51     bool operator==(const FontDescription&) const;
52     bool operator!=(const FontDescription& other) const { return !(*this == other); }
53     
54     const FontFamily& family() const { return m_familyList; }
55     FontFamily& firstFamily() { return m_familyList; }
56     float specifiedSize() const { return m_specifiedSize; }
57     float computedSize() const { return m_computedSize; }
58     bool italic() const { return m_italic; }
59     bool bold() const { return weight() == cBoldWeight; }
60     int computedPixelSize() const { return int(m_computedSize + 0.5f); }
61     bool smallCaps() const { return m_smallCaps; }
62     bool isAbsoluteSize() const { return m_isAbsoluteSize; }
63     unsigned weight() const { return m_weight; }
64     FontStretch stretch() const { return static_cast<FontStretch>(m_stretch); }
65     FontStretch narrowerStretch() const { return (m_stretch == FontStretchExpanded) ? FontStretchNormal : FontStretchCondensed; }
66     FontStretch widerStretch() const { return (m_stretch == FontStretchCondensed) ? FontStretchNormal : FontStretchExpanded; }
67     GenericFamilyType genericFamily() const { return static_cast<GenericFamilyType>(m_genericFamily); }
68     bool usePrinterFont() const { return m_usePrinterFont; }
69     int keywordSize() const { return m_keywordSize; }
70
71     void setFamily(const FontFamily& family) { m_familyList = family; }
72     void setComputedSize(float s) { m_computedSize = s; }
73     void setSpecifiedSize(float s) { m_specifiedSize = s; }
74     void setItalic(bool i) { m_italic = i; }
75     void setBold(bool b) { m_weight = (b ? cBoldWeight : cNormalWeight); }
76     void setSmallCaps(bool c) { m_smallCaps = c; }
77     void setIsAbsoluteSize(bool s) { m_isAbsoluteSize = s; }
78     void setWeight(unsigned w) { m_weight = w; }
79     void setStretch(FontStretch s) { m_stretch = s; }
80     void setGenericFamily(GenericFamilyType genericFamily) { m_genericFamily = genericFamily; }
81     void setUsePrinterFont(bool p) { m_usePrinterFont = p; }
82     void setKeywordSize(int s) { m_keywordSize = s; }
83
84 private:
85     FontFamily m_familyList; // The list of font families to be used.
86
87     float m_specifiedSize;   // Specified CSS value. Independent of rendering issues such as integer
88                              // rounding, minimum font sizes, and zooming.
89     float m_computedSize;    // Computed size adjusted for the minimum font size and the zoom factor.  
90
91     bool m_italic : 1;
92     bool m_smallCaps : 1;
93     bool m_isAbsoluteSize : 1;   // Whether or not CSS specified an explicit size
94                                  // (logical sizes like "medium" don't count).
95     unsigned m_weight : 8;
96     unsigned m_stretch : 4;       // FontStretch
97     unsigned m_genericFamily : 3; // GenericFamilyType
98     bool m_usePrinterFont : 1;
99     
100     int m_keywordSize : 4; // We cache whether or not a font is currently represented by a CSS keyword (e.g., medium).  If so,
101                            // then we can accurately translate across different generic families to adjust for different preference settings
102                            // (e.g., 13px monospace vs. 16px everything else).  Sizes are 1-8 (like the HTML size values for <font>).
103 };
104
105 inline bool FontDescription::operator==(const FontDescription& other) const
106 {
107     return m_familyList == other.m_familyList
108         && m_specifiedSize == other.m_specifiedSize
109         && m_computedSize == other.m_computedSize
110         && m_italic == other.m_italic
111         && m_smallCaps == other.m_smallCaps
112         && m_isAbsoluteSize == other.m_isAbsoluteSize
113         && m_weight == other.m_weight
114         && m_stretch == other.m_stretch
115         && m_genericFamily == other.m_genericFamily
116         && m_usePrinterFont == other.m_usePrinterFont
117         && m_keywordSize == other.m_keywordSize;
118 }
119
120 }
121
122 #endif