9009e68cccfdc6847941845e8ea83ddcb24a6348
[WebKit-https.git] / WebCore / platform / Font.cpp
1 /**
2  * This file is part of the html renderer for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2000 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2003, 2006 Apple Computer, Inc.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25
26 #include "config.h"
27 #include "Font.h"
28 #include "FontData.h"
29
30 #include "FontFallbackList.h"
31 #include "GraphicsContext.h"
32 #include "KWQKHTMLSettings.h"
33
34 namespace WebCore {
35
36 Font::Font() :m_fontList(0), m_letterSpacing(0), m_wordSpacing(0) {}
37 Font::Font(const FontDescription& fd, short letterSpacing, short wordSpacing) 
38 : m_fontDescription(fd),
39   m_fontList(0),
40   m_letterSpacing(letterSpacing),
41   m_wordSpacing(wordSpacing)
42 {}
43
44 Font::Font(const Font& other)
45 {
46     m_fontDescription = other.m_fontDescription;
47     m_fontList = other.m_fontList;
48     m_letterSpacing = other.m_letterSpacing;
49     m_wordSpacing = other.m_wordSpacing;
50 }
51
52 Font& Font::operator=(const Font& other)
53 {
54     if (&other != this) {
55         m_fontDescription = other.m_fontDescription;
56         m_fontList = other.m_fontList;
57         m_letterSpacing = other.m_letterSpacing;
58         m_wordSpacing = other.m_wordSpacing;
59     }
60     return *this;
61 }
62
63 Font::~Font()
64 {
65 }
66
67 void Font::update() const
68 {
69     // FIXME: It is pretty crazy that we are willing to just poke into a RefPtr, but it ends up 
70     // being reasonably safe (because inherited fonts in the render tree pick up the new
71     // style anyway.  Other copies are transient, e.g., the state in the GraphicsContext, and
72     // won't stick around long enough to get you in trouble).  Still, this is pretty disgusting,
73     // and could eventually be rectified by using RefPtrs for Fonts themselves.
74     if (!m_fontList)
75         m_fontList = new FontFallbackList();
76     m_fontList->invalidate();
77 }
78
79 int Font::width(const UChar* chs, int slen, int pos, int len, int tabWidth, int xpos) const
80 {
81     // FIXME: Want to define an lroundf for win32.
82 #if __APPLE__
83     return lroundf(floatWidth(chs + pos, slen - pos, 0, len, tabWidth, xpos));
84 #else
85     return floatWidth(chs + pos, slen - pos, 0, len, tabWidth, xpos) + 0.5f;
86 #endif
87 }
88
89 int Font::ascent() const
90 {
91     assert(m_fontList);
92     return m_fontList->primaryFont(fontDescription())->ascent();
93 }
94
95 int Font::descent() const
96 {
97     assert(m_fontList);
98     return m_fontList->primaryFont(fontDescription())->descent();
99 }
100
101 int Font::lineSpacing() const
102 {
103     assert(m_fontList);
104     return m_fontList->primaryFont(fontDescription())->lineSpacing();
105 }
106
107 float Font::xHeight() const
108 {
109     assert(m_fontList);
110     return m_fontList->primaryFont(fontDescription())->xHeight();
111 }
112
113 bool Font::isFixedPitch() const
114 {
115     assert(m_fontList);
116     return m_fontList->isFixedPitch(fontDescription());
117 }
118
119 }