WebKit:
[WebKit-https.git] / WebCore / kwq / KWQFont.mm
1 /*
2  * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "KWQFont.h"
27
28 #import "KWQExceptions.h"
29 #import "KWQString.h"
30 #import "KWQFoundationExtras.h"
31 #import "WebCoreTextRendererFactory.h"
32
33 QFont::QFont()
34     : _trait(0)
35     , _size(12.0)
36     , _isPrinterFont(false)
37     , _NSFont(0)
38 {
39 }
40
41 QFont::~QFont()
42 {
43     KWQRelease(_NSFont);
44 }
45
46 QFont::QFont(const QFont &other)
47     : _family(other._family)
48     , _trait(other._trait)
49     , _size(other._size)
50     , _isPrinterFont(other._isPrinterFont)
51     , _NSFont(KWQRetain(other._NSFont))
52 {
53 }
54
55 QFont &QFont::operator=(const QFont &other)
56 {
57     _family = other._family;
58     _trait = other._trait;
59     _size = other._size;
60     _isPrinterFont = other._isPrinterFont;
61     KWQRetain(other._NSFont);
62     KWQRelease(_NSFont);
63     _NSFont = other._NSFont;
64     return *this;
65 }
66
67 QString QFont::family() const
68 {
69     return _family.family().string();
70 }
71
72 void QFont::setFamily(const QString &qfamilyName)
73 {
74     _family.setFamily(qfamilyName);
75     KWQRelease(_NSFont);
76     _NSFont = 0;
77 }
78
79 void QFont::setFirstFamily(const KWQFontFamily& family) 
80 {
81     _family = family;
82     KWQRelease(_NSFont);
83     _NSFont = 0;
84 }
85
86 void QFont::setPixelSize(float s)
87 {
88     if (_size != s) {
89         KWQRelease(_NSFont); 
90         _NSFont = 0;
91     }
92     _size = s;
93 }
94
95 void QFont::setWeight(int weight)
96 {
97     if (weight == Bold) {
98         if (!(_trait & NSBoldFontMask)){
99             KWQRelease(_NSFont);
100             _NSFont = 0;
101         }
102         _trait |= NSBoldFontMask;
103     } else if (weight == Normal) {
104         if ((_trait & NSBoldFontMask)){
105             KWQRelease(_NSFont);
106             _NSFont = 0;
107         }
108         _trait &= ~NSBoldFontMask;
109     }
110 }
111
112 void QFont::setPrinterFont(bool isPrinterFont)
113 {
114     _isPrinterFont = isPrinterFont;
115 }
116
117 int QFont::weight() const
118 {
119     return bold() ? Bold : Normal;
120 }
121
122 void QFont::setItalic(bool flag)
123 {
124     if (flag) {
125         if (!(_trait & NSItalicFontMask)){
126             KWQRelease(_NSFont);
127             _NSFont = 0;
128         }
129         _trait |= NSItalicFontMask;
130     } else {
131         if ((_trait & NSItalicFontMask)){
132             KWQRelease(_NSFont);
133             _NSFont = 0;
134         }
135         _trait &= ~NSItalicFontMask;
136     }
137 }
138
139 bool QFont::italic() const
140 {
141     return _trait & NSItalicFontMask;
142 }
143
144 bool QFont::bold() const
145 {
146     return _trait & NSBoldFontMask;
147 }
148
149 bool QFont::isFixedPitch() const
150 {
151     KWQ_BLOCK_EXCEPTIONS;
152     return [[WebCoreTextRendererFactory sharedFactory] isFontFixedPitch: getNSFont()];
153     KWQ_UNBLOCK_EXCEPTIONS;
154     return false;
155 }
156
157
158 bool QFont::operator==(const QFont &compareFont) const
159 {
160     return _family == compareFont._family
161         && _trait == compareFont._trait
162         && _size == compareFont._size
163         && _isPrinterFont == compareFont._isPrinterFont;
164 }
165
166 NSFont *QFont::getNSFont() const
167 {
168     if (!_NSFont) {
169         CREATE_FAMILY_ARRAY(*this, families);
170         KWQ_BLOCK_EXCEPTIONS;
171         _NSFont = KWQRetain([[WebCoreTextRendererFactory sharedFactory] 
172             fontWithFamilies:families
173                       traits:getNSTraits() 
174                         size:getNSSize()]);
175         KWQ_UNBLOCK_EXCEPTIONS;
176     }
177     return _NSFont;
178 }