2007-02-06 Mark Rowe <mrowe@apple.com>
[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 class FontDescription {
35 public:
36     enum GenericFamilyType { NoFamily, StandardFamily, SerifFamily, SansSerifFamily, 
37                              MonospaceFamily, CursiveFamily, FantasyFamily };
38
39     FontDescription()
40         : m_specifiedSize(0), m_computedSize(0), 
41           m_italic(false), m_smallCaps(false), m_isAbsoluteSize(false), m_weight(cNormalWeight), 
42           m_genericFamily(NoFamily), m_usePrinterFont(false), m_keywordSize(0)
43           {}
44     
45     bool operator==(const FontDescription&) const;
46     bool operator!=(const FontDescription& other) const { return !(*this == other); }
47     
48     const FontFamily& family() const { return m_familyList; }
49     FontFamily& firstFamily() { return m_familyList; }
50     float specifiedSize() const { return m_specifiedSize; }
51     float computedSize() const { return m_computedSize; }
52     bool italic() const { return m_italic; }
53     bool bold() const { return weight() == cBoldWeight; }
54     int computedPixelSize() const { return int(m_computedSize + 0.5f); }
55     bool smallCaps() const { return m_smallCaps; }
56     bool isAbsoluteSize() const { return m_isAbsoluteSize; }
57     unsigned weight() const { return m_weight; }
58     GenericFamilyType genericFamily() const { return static_cast<GenericFamilyType>(m_genericFamily); }
59     bool usePrinterFont() const { return m_usePrinterFont; }
60     int keywordSize() const { return m_keywordSize; }
61
62     void setFamily(const FontFamily& family) { m_familyList = family; }
63     void setComputedSize(float s) { m_computedSize = s; }
64     void setSpecifiedSize(float s) { m_specifiedSize = s; }
65     void setItalic(bool i) { m_italic = i; }
66     void setBold(bool b) { m_weight = (b ? cBoldWeight : cNormalWeight); }
67     void setSmallCaps(bool c) { m_smallCaps = c; }
68     void setIsAbsoluteSize(bool s) { m_isAbsoluteSize = s; }
69     void setWeight(unsigned w) { m_weight = w; }
70     void setGenericFamily(GenericFamilyType genericFamily) { m_genericFamily = genericFamily; }
71     void setUsePrinterFont(bool p) { m_usePrinterFont = p; }
72     void setKeywordSize(int s) { m_keywordSize = s; }
73
74 private:
75     FontFamily m_familyList; // The list of font families to be used.
76
77     float m_specifiedSize;   // Specified CSS value. Independent of rendering issues such as integer
78                              // rounding, minimum font sizes, and zooming.
79     float m_computedSize;    // Computed size adjusted for the minimum font size and the zoom factor.  
80
81     bool m_italic : 1;
82     bool m_smallCaps : 1;
83     bool m_isAbsoluteSize : 1;   // Whether or not CSS specified an explicit size
84                                  // (logical sizes like "medium" don't count).
85     unsigned m_weight : 8;
86     unsigned m_genericFamily : 3; // GenericFamilyType
87     bool m_usePrinterFont : 1;
88     
89     int m_keywordSize : 4; // We cache whether or not a font is currently represented by a CSS keyword (e.g., medium).  If so,
90                            // then we can accurately translate across different generic families to adjust for different preference settings
91                            // (e.g., 13px monospace vs. 16px everything else).  Sizes are 1-8 (like the HTML size values for <font>).
92 };
93
94 inline bool FontDescription::operator==(const FontDescription& other) const
95 {
96     return m_familyList == other.m_familyList
97         && m_specifiedSize == other.m_specifiedSize
98         && m_computedSize == other.m_computedSize
99         && m_italic == other.m_italic
100         && m_smallCaps == other.m_smallCaps
101         && m_isAbsoluteSize == other.m_isAbsoluteSize
102         && m_weight == other.m_weight
103         && m_genericFamily == other.m_genericFamily
104         && m_usePrinterFont == other.m_usePrinterFont
105         && m_keywordSize == other.m_keywordSize;
106 }
107
108 }
109
110 #endif