blob: f8cb3bd26674651e6ace0682db0af8ebd5f89f35 [file] [log] [blame]
/*
* Copyright (C) 2003, 2006, 2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
namespace WebCore {
enum class TextRenderingMode : uint8_t {
AutoTextRendering,
OptimizeSpeed,
OptimizeLegibility,
GeometricPrecision
};
enum class FontSmoothingMode : uint8_t {
AutoSmoothing,
NoSmoothing,
Antialiased,
SubpixelAntialiased
};
// This setting is used to provide ways of switching between multiple rendering modes that may have different
// metrics. It is used to switch between CG and GDI text on Windows.
enum class FontRenderingMode : uint8_t {
Normal,
Alternate
};
enum class FontOrientation : uint8_t {
Horizontal,
Vertical
};
enum class NonCJKGlyphOrientation : uint8_t {
Mixed,
Upright
};
// Here, "Leading" and "Trailing" are relevant after the line has been rearranged for bidi.
// ("Leading" means "left" and "Trailing" means "right.")
enum ExpansionBehaviorFlags {
ForbidTrailingExpansion = 0 << 0,
AllowTrailingExpansion = 1 << 0,
ForceTrailingExpansion = 2 << 0,
TrailingExpansionMask = 3 << 0,
ForbidLeadingExpansion = 0 << 2,
AllowLeadingExpansion = 1 << 2,
ForceLeadingExpansion = 2 << 2,
LeadingExpansionMask = 3 << 2,
DefaultExpansion = AllowTrailingExpansion | ForbidLeadingExpansion,
};
typedef unsigned ExpansionBehavior;
enum FontSynthesisValues {
FontSynthesisNone = 0x0,
FontSynthesisWeight = 0x1,
FontSynthesisStyle = 0x2,
FontSynthesisSmallCaps = 0x4
};
typedef unsigned FontSynthesis;
const unsigned FontSynthesisWidth = 3;
enum class FontVariantLigatures : uint8_t {
Normal,
Yes,
No
};
enum class FontVariantPosition : uint8_t {
Normal,
Subscript,
Superscript
};
enum class FontVariantCaps : uint8_t {
Normal,
Small,
AllSmall,
Petite,
AllPetite,
Unicase,
Titling
};
enum class FontVariantNumericFigure : uint8_t {
Normal,
LiningNumbers,
OldStyleNumbers
};
enum class FontVariantNumericSpacing : uint8_t {
Normal,
ProportionalNumbers,
TabularNumbers
};
enum class FontVariantNumericFraction : uint8_t {
Normal,
DiagonalFractions,
StackedFractions
};
enum class FontVariantNumericOrdinal : uint8_t {
Normal,
Yes
};
enum class FontVariantNumericSlashedZero : uint8_t {
Normal,
Yes
};
enum class FontVariantAlternates : uint8_t {
Normal,
HistoricalForms
};
enum class FontVariantEastAsianVariant : uint8_t {
Normal,
Jis78,
Jis83,
Jis90,
Jis04,
Simplified,
Traditional
};
enum class FontVariantEastAsianWidth : uint8_t {
Normal,
Full,
Proportional
};
enum class FontVariantEastAsianRuby : uint8_t {
Normal,
Yes
};
struct FontVariantSettings {
FontVariantSettings()
: commonLigatures(FontVariantLigatures::Normal)
, discretionaryLigatures(FontVariantLigatures::Normal)
, historicalLigatures(FontVariantLigatures::Normal)
, contextualAlternates(FontVariantLigatures::Normal)
, position(FontVariantPosition::Normal)
, caps(FontVariantCaps::Normal)
, numericFigure(FontVariantNumericFigure::Normal)
, numericSpacing(FontVariantNumericSpacing::Normal)
, numericFraction(FontVariantNumericFraction::Normal)
, numericOrdinal(FontVariantNumericOrdinal::Normal)
, numericSlashedZero(FontVariantNumericSlashedZero::Normal)
, alternates(FontVariantAlternates::Normal)
, eastAsianVariant(FontVariantEastAsianVariant::Normal)
, eastAsianWidth(FontVariantEastAsianWidth::Normal)
, eastAsianRuby(FontVariantEastAsianRuby::Normal)
{
}
FontVariantSettings(
FontVariantLigatures commonLigatures,
FontVariantLigatures discretionaryLigatures,
FontVariantLigatures historicalLigatures,
FontVariantLigatures contextualAlternates,
FontVariantPosition position,
FontVariantCaps caps,
FontVariantNumericFigure numericFigure,
FontVariantNumericSpacing numericSpacing,
FontVariantNumericFraction numericFraction,
FontVariantNumericOrdinal numericOrdinal,
FontVariantNumericSlashedZero numericSlashedZero,
FontVariantAlternates alternates,
FontVariantEastAsianVariant eastAsianVariant,
FontVariantEastAsianWidth eastAsianWidth,
FontVariantEastAsianRuby eastAsianRuby)
: commonLigatures(commonLigatures)
, discretionaryLigatures(discretionaryLigatures)
, historicalLigatures(historicalLigatures)
, contextualAlternates(contextualAlternates)
, position(position)
, caps(caps)
, numericFigure(numericFigure)
, numericSpacing(numericSpacing)
, numericFraction(numericFraction)
, numericOrdinal(numericOrdinal)
, numericSlashedZero(numericSlashedZero)
, alternates(alternates)
, eastAsianVariant(eastAsianVariant)
, eastAsianWidth(eastAsianWidth)
, eastAsianRuby(eastAsianRuby)
{
}
bool isAllNormal() const
{
return commonLigatures == FontVariantLigatures::Normal
&& discretionaryLigatures == FontVariantLigatures::Normal
&& historicalLigatures == FontVariantLigatures::Normal
&& contextualAlternates == FontVariantLigatures::Normal
&& position == FontVariantPosition::Normal
&& caps == FontVariantCaps::Normal
&& numericFigure == FontVariantNumericFigure::Normal
&& numericSpacing == FontVariantNumericSpacing::Normal
&& numericFraction == FontVariantNumericFraction::Normal
&& numericOrdinal == FontVariantNumericOrdinal::Normal
&& numericSlashedZero == FontVariantNumericSlashedZero::Normal
&& alternates == FontVariantAlternates::Normal
&& eastAsianVariant == FontVariantEastAsianVariant::Normal
&& eastAsianWidth == FontVariantEastAsianWidth::Normal
&& eastAsianRuby == FontVariantEastAsianRuby::Normal;
}
bool operator==(const FontVariantSettings& other) const
{
return commonLigatures == other.commonLigatures
&& discretionaryLigatures == other.discretionaryLigatures
&& historicalLigatures == other.historicalLigatures
&& contextualAlternates == other.contextualAlternates
&& position == other.position
&& caps == other.caps
&& numericFigure == other.numericFigure
&& numericSpacing == other.numericSpacing
&& numericFraction == other.numericFraction
&& numericOrdinal == other.numericOrdinal
&& numericSlashedZero == other.numericSlashedZero
&& alternates == other.alternates
&& eastAsianVariant == other.eastAsianVariant
&& eastAsianWidth == other.eastAsianWidth
&& eastAsianRuby == other.eastAsianRuby;
}
bool operator!=(const FontVariantSettings& other) const { return !(*this == other); }
unsigned uniqueValue() const
{
return static_cast<unsigned>(commonLigatures) << 26
| static_cast<unsigned>(discretionaryLigatures) << 24
| static_cast<unsigned>(historicalLigatures) << 22
| static_cast<unsigned>(contextualAlternates) << 20
| static_cast<unsigned>(position) << 18
| static_cast<unsigned>(caps) << 15
| static_cast<unsigned>(numericFigure) << 13
| static_cast<unsigned>(numericSpacing) << 11
| static_cast<unsigned>(numericFraction) << 9
| static_cast<unsigned>(numericOrdinal) << 8
| static_cast<unsigned>(numericSlashedZero) << 7
| static_cast<unsigned>(alternates) << 6
| static_cast<unsigned>(eastAsianVariant) << 3
| static_cast<unsigned>(eastAsianWidth) << 1
| static_cast<unsigned>(eastAsianRuby) << 0;
}
// FIXME: this would be much more compact with bitfields.
FontVariantLigatures commonLigatures;
FontVariantLigatures discretionaryLigatures;
FontVariantLigatures historicalLigatures;
FontVariantLigatures contextualAlternates;
FontVariantPosition position;
FontVariantCaps caps;
FontVariantNumericFigure numericFigure;
FontVariantNumericSpacing numericSpacing;
FontVariantNumericFraction numericFraction;
FontVariantNumericOrdinal numericOrdinal;
FontVariantNumericSlashedZero numericSlashedZero;
FontVariantAlternates alternates;
FontVariantEastAsianVariant eastAsianVariant;
FontVariantEastAsianWidth eastAsianWidth;
FontVariantEastAsianRuby eastAsianRuby;
};
struct FontVariantLigaturesValues {
FontVariantLigaturesValues(
FontVariantLigatures commonLigatures,
FontVariantLigatures discretionaryLigatures,
FontVariantLigatures historicalLigatures,
FontVariantLigatures contextualAlternates)
: commonLigatures(commonLigatures)
, discretionaryLigatures(discretionaryLigatures)
, historicalLigatures(historicalLigatures)
, contextualAlternates(contextualAlternates)
{
}
FontVariantLigatures commonLigatures;
FontVariantLigatures discretionaryLigatures;
FontVariantLigatures historicalLigatures;
FontVariantLigatures contextualAlternates;
};
struct FontVariantNumericValues {
FontVariantNumericValues(
FontVariantNumericFigure figure,
FontVariantNumericSpacing spacing,
FontVariantNumericFraction fraction,
FontVariantNumericOrdinal ordinal,
FontVariantNumericSlashedZero slashedZero)
: figure(figure)
, spacing(spacing)
, fraction(fraction)
, ordinal(ordinal)
, slashedZero(slashedZero)
{
}
FontVariantNumericFigure figure;
FontVariantNumericSpacing spacing;
FontVariantNumericFraction fraction;
FontVariantNumericOrdinal ordinal;
FontVariantNumericSlashedZero slashedZero;
};
struct FontVariantEastAsianValues {
FontVariantEastAsianValues(
FontVariantEastAsianVariant variant,
FontVariantEastAsianWidth width,
FontVariantEastAsianRuby ruby)
: variant(variant)
, width(width)
, ruby(ruby)
{
}
FontVariantEastAsianVariant variant;
FontVariantEastAsianWidth width;
FontVariantEastAsianRuby ruby;
};
enum class FontWidthVariant : uint8_t {
RegularWidth,
HalfWidth,
ThirdWidth,
QuarterWidth,
LastFontWidthVariant = QuarterWidth
};
const unsigned FontWidthVariantWidth = 2;
COMPILE_ASSERT(!(static_cast<unsigned>(FontWidthVariant::LastFontWidthVariant) >> FontWidthVariantWidth), FontWidthVariantWidth_is_correct);
enum class FontSmallCaps : uint8_t {
Off = 0,
On = 1
};
enum class Kerning : uint8_t {
Auto,
Normal,
NoShift
};
enum class FontOpticalSizing : uint8_t {
Enabled,
Disabled
};
// https://www.microsoft.com/typography/otspec/fvar.htm#VAT
enum class FontStyleAxis : uint8_t {
slnt,
ital
};
enum class AllowUserInstalledFonts : uint8_t {
No,
Yes
};
}