97d754d02a42de5e3346e1d30a36d545ae0654cf
[WebKit-https.git] / Source / WebCore / platform / graphics / opentype / OpenTypeMathData.h
1 /*
2  * Copyright (C) 2014 Frederic Wang (fred.wang@free.fr). All rights reserved.
3  * Copyright (C) 2016 Igalia S.L. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #pragma once
28
29 #include "Glyph.h"
30 #include <wtf/PassRefPtr.h>
31 #include <wtf/RefCounted.h>
32 #include <wtf/Vector.h>
33
34 #if !ENABLE(OPENTYPE_MATH) && USE(HARFBUZZ)
35 #include <hb-ot.h>
36 #endif
37
38 namespace WebCore {
39
40 class FontPlatformData;
41 class SharedBuffer;
42 class Font;
43
44 class OpenTypeMathData : public RefCounted<OpenTypeMathData> {
45 public:
46     static PassRefPtr<OpenTypeMathData> create(const FontPlatformData& font)
47     {
48         return adoptRef(new OpenTypeMathData(font));
49     }
50     ~OpenTypeMathData();
51
52 #if ENABLE(OPENTYPE_MATH)
53     bool hasMathData() const { return m_mathBuffer; }
54 #elif USE(HARFBUZZ)
55     bool hasMathData() const { return m_mathFont.get(); }
56 #else
57     bool hasMathData() const { return false; }
58 #endif
59
60     // These constants are defined in the MATH table.
61     // The implementation of OpenTypeMathData::getMathConstant assumes that they correspond to the indices of the MathContant table.
62     enum MathConstant {
63         ScriptPercentScaleDown,
64         ScriptScriptPercentScaleDown,
65         DelimitedSubFormulaMinHeight,
66         DisplayOperatorMinHeight,
67         MathLeading,
68         AxisHeight,
69         AccentBaseHeight,
70         FlattenedAccentBaseHeight,
71         SubscriptShiftDown,
72         SubscriptTopMax,
73         SubscriptBaselineDropMin,
74         SuperscriptShiftUp,
75         SuperscriptShiftUpCramped,
76         SuperscriptBottomMin,
77         SuperscriptBaselineDropMax,
78         SubSuperscriptGapMin,
79         SuperscriptBottomMaxWithSubscript,
80         SpaceAfterScript,
81         UpperLimitGapMin,
82         UpperLimitBaselineRiseMin,
83         LowerLimitGapMin,
84         LowerLimitBaselineDropMin,
85         StackTopShiftUp,
86         StackTopDisplayStyleShiftUp,
87         StackBottomShiftDown,
88         StackBottomDisplayStyleShiftDown,
89         StackGapMin,
90         StackDisplayStyleGapMin,
91         StretchStackTopShiftUp,
92         StretchStackBottomShiftDown,
93         StretchStackGapAboveMin,
94         StretchStackGapBelowMin,
95         FractionNumeratorShiftUp,
96         FractionNumeratorDisplayStyleShiftUp,
97         FractionDenominatorShiftDown,
98         FractionDenominatorDisplayStyleShiftDown,
99         FractionNumeratorGapMin,
100         FractionNumDisplayStyleGapMin,
101         FractionRuleThickness,
102         FractionDenominatorGapMin,
103         FractionDenomDisplayStyleGapMin,
104         SkewedFractionHorizontalGap,
105         SkewedFractionVerticalGap,
106         OverbarVerticalGap,
107         OverbarRuleThickness,
108         OverbarExtraAscender,
109         UnderbarVerticalGap,
110         UnderbarRuleThickness,
111         UnderbarExtraDescender,
112         RadicalVerticalGap,
113         RadicalDisplayStyleVerticalGap,
114         RadicalRuleThickness,
115         RadicalExtraAscender,
116         RadicalKernBeforeDegree,
117         RadicalKernAfterDegree,
118         RadicalDegreeBottomRaisePercent
119     };
120
121     struct AssemblyPart {
122         Glyph glyph;
123         bool isExtender;
124     };
125
126     float getMathConstant(const Font&, MathConstant) const;
127     float getItalicCorrection(const Font&, Glyph) const;
128     void getMathVariants(Glyph, bool isVertical, Vector<Glyph>& sizeVariants, Vector<AssemblyPart>& assemblyParts) const;
129
130 private:
131     explicit OpenTypeMathData(const FontPlatformData&);
132
133 #if ENABLE(OPENTYPE_MATH)
134     RefPtr<SharedBuffer> m_mathBuffer;
135 #elif USE(HARFBUZZ)
136     struct HbFontDeleter {
137         void operator()(hb_font_t* font)
138         {
139             hb_font_destroy(font);
140         }
141     };
142     std::unique_ptr<hb_font_t, HbFontDeleter> m_mathFont;
143 #endif
144 };
145
146 } // namespace WebCore