Unify font-variant-* with font-variant shorthand
[WebKit.git] / Source / WebCore / platform / text / TextFlags.h
1 /*
2  * Copyright (C) 2003, 2006 Apple 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 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 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 #ifndef TextFlags_h
27 #define TextFlags_h
28
29 // <rdar://problem/16980736>: Web fonts crash on certain OSes when using CTFontManagerCreateFontDescriptorFromData()
30 // FIXME: When we have moved entirely to CORETEXT_WEB_FONTS, remove the isCustomFont member variable from Font, since it will no longer be used.
31 // See https://bug-145873-attachments.webkit.org/attachment.cgi?id=254710
32 #if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101000
33 #define CORETEXT_WEB_FONTS 0
34 #else
35 #define CORETEXT_WEB_FONTS 1
36 #endif
37
38 namespace WebCore {
39
40 enum TextRenderingMode { AutoTextRendering, OptimizeSpeed, OptimizeLegibility, GeometricPrecision };
41
42 enum FontSmoothingMode { AutoSmoothing, NoSmoothing, Antialiased, SubpixelAntialiased };
43
44 // This setting is used to provide ways of switching between multiple rendering modes that may have different
45 // metrics. It is used to switch between CG and GDI text on Windows.
46 enum class FontRenderingMode { Normal, Alternate };
47
48 enum FontOrientation { Horizontal, Vertical };
49
50 enum class NonCJKGlyphOrientation { Mixed, Upright };
51
52 // Here, "Leading" and "Trailing" are relevant after the line has been rearranged for bidi.
53 // ("Leading" means "left" and "Trailing" means "right.")
54 enum ExpansionBehaviorFlags {
55     ForbidTrailingExpansion = 0 << 0,
56     AllowTrailingExpansion = 1 << 0,
57     ForceTrailingExpansion = 2 << 0,
58     TrailingExpansionMask = 3 << 0,
59
60     ForbidLeadingExpansion = 0 << 2,
61     AllowLeadingExpansion = 1 << 2,
62     ForceLeadingExpansion = 2 << 2,
63     LeadingExpansionMask = 3 << 2,
64 };
65 typedef unsigned ExpansionBehavior;
66
67 enum FontSynthesisValues {
68     FontSynthesisNone = 0x0,
69     FontSynthesisWeight = 0x1,
70     FontSynthesisStyle = 0x2
71 };
72 typedef unsigned FontSynthesis;
73 const unsigned FontSynthesisWidth = 2;
74
75 enum class FontVariantLigatures {
76     Normal,
77     Yes,
78     No
79 };
80
81 enum class FontVariantPosition {
82     Normal,
83     Subscript,
84     Superscript
85 };
86
87 enum class FontVariantCaps {
88     Normal,
89     Small,
90     AllSmall,
91     Petite,
92     AllPetite,
93     Unicase,
94     Titling
95 };
96
97 enum class FontVariantNumericFigure {
98     Normal,
99     LiningNumbers,
100     OldStyleNumbers
101 };
102
103 enum class FontVariantNumericSpacing {
104     Normal,
105     ProportionalNumbers,
106     TabularNumbers
107 };
108
109 enum class FontVariantNumericFraction {
110     Normal,
111     DiagonalFractions,
112     StackedFractions
113 };
114
115 enum class FontVariantNumericOrdinal {
116     Normal,
117     Yes
118 };
119
120 enum class FontVariantNumericSlashedZero {
121     Normal,
122     Yes
123 };
124
125 enum class FontVariantAlternates {
126     Normal,
127     HistoricalForms
128 };
129
130 enum class FontVariantEastAsianVariant {
131     Normal,
132     Jis78,
133     Jis83,
134     Jis90,
135     Jis04,
136     Simplified,
137     Traditional
138 };
139
140 enum class FontVariantEastAsianWidth {
141     Normal,
142     Full,
143     Proportional
144 };
145
146 enum class FontVariantEastAsianRuby {
147     Normal,
148     Yes
149 };
150
151 struct FontVariantSettings {
152     FontVariantSettings()
153         : commonLigatures(FontVariantLigatures::Normal)
154         , discretionaryLigatures(FontVariantLigatures::Normal)
155         , historicalLigatures(FontVariantLigatures::Normal)
156         , contextualAlternates(FontVariantLigatures::Normal)
157         , position(FontVariantPosition::Normal)
158         , caps(FontVariantCaps::Normal)
159         , numericFigure(FontVariantNumericFigure::Normal)
160         , numericSpacing(FontVariantNumericSpacing::Normal)
161         , numericFraction(FontVariantNumericFraction::Normal)
162         , numericOrdinal(FontVariantNumericOrdinal::Normal)
163         , numericSlashedZero(FontVariantNumericSlashedZero::Normal)
164         , alternates(FontVariantAlternates::Normal)
165         , eastAsianVariant(FontVariantEastAsianVariant::Normal)
166         , eastAsianWidth(FontVariantEastAsianWidth::Normal)
167         , eastAsianRuby(FontVariantEastAsianRuby::Normal)
168     {
169     }
170
171     FontVariantSettings(
172         FontVariantLigatures commonLigatures,
173         FontVariantLigatures discretionaryLigatures,
174         FontVariantLigatures historicalLigatures,
175         FontVariantLigatures contextualAlternates,
176         FontVariantPosition position,
177         FontVariantCaps caps,
178         FontVariantNumericFigure numericFigure,
179         FontVariantNumericSpacing numericSpacing,
180         FontVariantNumericFraction numericFraction,
181         FontVariantNumericOrdinal numericOrdinal,
182         FontVariantNumericSlashedZero numericSlashedZero,
183         FontVariantAlternates alternates,
184         FontVariantEastAsianVariant eastAsianVariant,
185         FontVariantEastAsianWidth eastAsianWidth,
186         FontVariantEastAsianRuby eastAsianRuby)
187             : commonLigatures(commonLigatures)
188             , discretionaryLigatures(discretionaryLigatures)
189             , historicalLigatures(historicalLigatures)
190             , contextualAlternates(contextualAlternates)
191             , position(position)
192             , caps(caps)
193             , numericFigure(numericFigure)
194             , numericSpacing(numericSpacing)
195             , numericFraction(numericFraction)
196             , numericOrdinal(numericOrdinal)
197             , numericSlashedZero(numericSlashedZero)
198             , alternates(alternates)
199             , eastAsianVariant(eastAsianVariant)
200             , eastAsianWidth(eastAsianWidth)
201             , eastAsianRuby(eastAsianRuby)
202     {
203     }
204
205     bool isAllNormal() const
206     {
207         return commonLigatures == FontVariantLigatures::Normal
208             && discretionaryLigatures == FontVariantLigatures::Normal
209             && historicalLigatures == FontVariantLigatures::Normal
210             && contextualAlternates == FontVariantLigatures::Normal
211             && position == FontVariantPosition::Normal
212             && caps == FontVariantCaps::Normal
213             && numericFigure == FontVariantNumericFigure::Normal
214             && numericSpacing == FontVariantNumericSpacing::Normal
215             && numericFraction == FontVariantNumericFraction::Normal
216             && numericOrdinal == FontVariantNumericOrdinal::Normal
217             && numericSlashedZero == FontVariantNumericSlashedZero::Normal
218             && alternates == FontVariantAlternates::Normal
219             && eastAsianVariant == FontVariantEastAsianVariant::Normal
220             && eastAsianWidth == FontVariantEastAsianWidth::Normal
221             && eastAsianRuby == FontVariantEastAsianRuby::Normal;
222     }
223
224     bool operator==(const FontVariantSettings& other)
225     {
226         return commonLigatures == other.commonLigatures
227             && discretionaryLigatures == other.discretionaryLigatures
228             && historicalLigatures == other.historicalLigatures
229             && contextualAlternates == other.contextualAlternates
230             && position == other.position
231             && caps == other.caps
232             && numericFigure == other.numericFigure
233             && numericSpacing == other.numericSpacing
234             && numericFraction == other.numericFraction
235             && numericOrdinal == other.numericOrdinal
236             && numericSlashedZero == other.numericSlashedZero
237             && alternates == other.alternates
238             && eastAsianVariant == other.eastAsianVariant
239             && eastAsianWidth == other.eastAsianWidth
240             && eastAsianRuby == other.eastAsianRuby;
241     }
242
243     FontVariantLigatures commonLigatures;
244     FontVariantLigatures discretionaryLigatures;
245     FontVariantLigatures historicalLigatures;
246     FontVariantLigatures contextualAlternates;
247     FontVariantPosition position;
248     FontVariantCaps caps;
249     FontVariantNumericFigure numericFigure;
250     FontVariantNumericSpacing numericSpacing;
251     FontVariantNumericFraction numericFraction;
252     FontVariantNumericOrdinal numericOrdinal;
253     FontVariantNumericSlashedZero numericSlashedZero;
254     FontVariantAlternates alternates;
255     FontVariantEastAsianVariant eastAsianVariant;
256     FontVariantEastAsianWidth eastAsianWidth;
257     FontVariantEastAsianRuby eastAsianRuby;
258 };
259
260 enum FontWidthVariant {
261     RegularWidth,
262     HalfWidth,
263     ThirdWidth,
264     QuarterWidth,
265     LastFontWidthVariant = QuarterWidth
266 };
267
268 const unsigned FontWidthVariantWidth = 2;
269
270 COMPILE_ASSERT(!(LastFontWidthVariant >> FontWidthVariantWidth), FontWidthVariantWidth_is_correct);
271
272 enum FontWeight {
273     FontWeight100,
274     FontWeight200,
275     FontWeight300,
276     FontWeight400,
277     FontWeight500,
278     FontWeight600,
279     FontWeight700,
280     FontWeight800,
281     FontWeight900,
282     FontWeightNormal = FontWeight400,
283     FontWeightBold = FontWeight700
284 };
285
286 enum FontItalic {
287     FontItalicOff = 0,
288     FontItalicOn = 1
289 };
290
291 enum FontSmallCaps {
292     FontSmallCapsOff = 0,
293     FontSmallCapsOn = 1
294 };
295
296 enum {
297     FontStyleNormalBit = 0,
298     FontStyleItalicBit,
299     FontWeight100Bit,
300     FontWeight200Bit,
301     FontWeight300Bit,
302     FontWeight400Bit,
303     FontWeight500Bit,
304     FontWeight600Bit,
305     FontWeight700Bit,
306     FontWeight800Bit,
307     FontWeight900Bit,
308     FontTraitsMaskWidth
309 };
310
311 enum FontTraitsMask {
312     FontStyleNormalMask = 1 << FontStyleNormalBit,
313     FontStyleItalicMask = 1 << FontStyleItalicBit,
314     FontStyleMask = FontStyleNormalMask | FontStyleItalicMask,
315
316     FontWeight100Mask = 1 << FontWeight100Bit,
317     FontWeight200Mask = 1 << FontWeight200Bit,
318     FontWeight300Mask = 1 << FontWeight300Bit,
319     FontWeight400Mask = 1 << FontWeight400Bit,
320     FontWeight500Mask = 1 << FontWeight500Bit,
321     FontWeight600Mask = 1 << FontWeight600Bit,
322     FontWeight700Mask = 1 << FontWeight700Bit,
323     FontWeight800Mask = 1 << FontWeight800Bit,
324     FontWeight900Mask = 1 << FontWeight900Bit,
325     FontWeightMask = FontWeight100Mask | FontWeight200Mask | FontWeight300Mask | FontWeight400Mask | FontWeight500Mask | FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask
326 };
327
328 enum class Kerning {
329     Auto,
330     Normal,
331     NoShift
332 };
333
334 }
335
336 #endif