blob: 1e300eb6a01cf491e0e3ad98be28abe866a77fc7 [file] [log] [blame]
/**
* Copyright (C) 2019-2023 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. AND ITS CONTRIBUTORS ``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 ITS 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
#include "RenderStyle.h"
#include "RenderStyleSetters.h"
#include "StyleBuilderState.h"
#include "StyleFontSizeFunctions.h"
namespace WebCore {
namespace Style {
inline const FontCascadeDescription& BuilderState::fontDescription() { return m_style.fontDescription(); }
inline void BuilderState::setFontDescription(FontCascadeDescription&& description) { m_fontDirty |= m_style.setFontDescriptionWithoutUpdate(WTFMove(description)); }
inline const FontCascadeDescription& BuilderState::parentFontDescription() { return parentStyle().fontDescription(); }
inline void BuilderState::setUsedZoom(float zoom) { m_fontDirty |= m_style.setUsedZoom(zoom); }
inline void BuilderState::setTextOrientation(TextOrientation orientation) { m_fontDirty |= m_style.setTextOrientation(orientation); }
inline void BuilderState::setWritingMode(StyleWritingMode mode) { m_fontDirty |= m_style.setWritingMode(mode); }
inline void BuilderState::setZoom(float zoom) { m_fontDirty |= m_style.setZoom(zoom); }
inline void BuilderState::setFontDescriptionKeywordSizeFromIdentifier(CSSValueID identifier)
{
if (m_style.fontDescription().keywordSizeAsIdentifier() == identifier)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setKeywordSizeFromIdentifier(identifier);
}
inline void BuilderState::setFontDescriptionIsAbsoluteSize(bool isAbsoluteSize)
{
if (m_style.fontDescription().isAbsoluteSize() == isAbsoluteSize)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setIsAbsoluteSize(isAbsoluteSize);
}
inline void BuilderState::setFontDescriptionFontSize(float fontSize)
{
if (m_style.fontDescription().specifiedSize() != fontSize) {
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setSpecifiedSize(fontSize);
}
SUPPRESS_UNCOUNTED_ARG auto computedSize = Style::computedFontSizeFromSpecifiedSize(fontSize, m_style.fontDescription().isAbsoluteSize(), useSVGZoomRules(), &style(), document());
if (m_style.fontDescription().computedSize() != computedSize) {
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setComputedSize(computedSize);
}
}
inline void BuilderState::setFontDescriptionFamilies(RefCountedFixedVector<AtomString>& families)
{
if (m_style.fontDescription().families() == families)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setFamilies(families);
fontCascade.updateUseBackslashAsYenSymbol();
}
inline void BuilderState::setFontDescriptionFamilies(Vector<AtomString>& families)
{
if (m_style.fontDescription().families() == families)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setFamilies(families);
fontCascade.updateUseBackslashAsYenSymbol();
}
inline void BuilderState::setFontDescriptionIsSpecifiedFont(bool isSpecifiedFont)
{
if (m_style.fontDescription().isSpecifiedFont() == isSpecifiedFont)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setIsSpecifiedFont(isSpecifiedFont);
}
inline void BuilderState::setFontDescriptionFeatureSettings(FontFeatureSettings&& featureSettings)
{
if (m_style.fontDescription().featureSettings() == featureSettings)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setFeatureSettings(WTFMove(featureSettings));
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionFontPalette(const FontPalette& fontPalette)
{
if (m_style.fontDescription().fontPalette() == fontPalette)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setFontPalette(fontPalette);
}
inline void BuilderState::setFontDescriptionFontSizeAdjust(FontSizeAdjust fontSizeAdjust)
{
if (m_style.fontDescription().fontSizeAdjust() == fontSizeAdjust)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setFontSizeAdjust(WTFMove(fontSizeAdjust));
}
inline void BuilderState::setFontDescriptionFontSmoothing(FontSmoothingMode fontSmoothing)
{
if (m_style.fontDescription().fontSmoothing() == fontSmoothing)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setFontSmoothing(WTFMove(fontSmoothing));
}
inline void BuilderState::setFontDescriptionFontSynthesisSmallCaps(FontSynthesisLonghandValue fontSynthesisSmallCaps)
{
if (m_style.fontDescription().fontSynthesisSmallCaps() == fontSynthesisSmallCaps)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setFontSynthesisSmallCaps(WTFMove(fontSynthesisSmallCaps));
}
inline void BuilderState::setFontDescriptionFontSynthesisStyle(FontSynthesisLonghandValue fontSynthesisStyle)
{
if (m_style.fontDescription().fontSynthesisStyle() == fontSynthesisStyle)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setFontSynthesisStyle(fontSynthesisStyle);
}
inline void BuilderState::setFontDescriptionFontSynthesisWeight(FontSynthesisLonghandValue fontSynthesisWeight)
{
if (m_style.fontDescription().fontSynthesisWeight() == fontSynthesisWeight)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setFontSynthesisWeight(fontSynthesisWeight);
}
inline void BuilderState::setFontDescriptionKerning(Kerning kerning)
{
if (m_style.fontDescription().kerning() == kerning)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setKerning(kerning);
fontCascade.updateEnableKerning();
}
inline void BuilderState::setFontDescriptionOpticalSizing(FontOpticalSizing opticalSizing)
{
if (m_style.fontDescription().opticalSizing() == opticalSizing)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setOpticalSizing(opticalSizing);
}
inline void BuilderState::setFontDescriptionSpecifiedLocale(const AtomString& specifiedLocale)
{
if (m_style.fontDescription().specifiedLocale() == specifiedLocale)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setSpecifiedLocale(specifiedLocale);
}
inline void BuilderState::setFontDescriptionTextAutospace(TextAutospace textAutospace)
{
if (m_style.fontDescription().textAutospace() == textAutospace)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setTextAutospace(textAutospace);
}
inline void BuilderState::setFontDescriptionTextRenderingMode(TextRenderingMode textRenderingMode)
{
if (m_style.fontDescription().textRenderingMode() == textRenderingMode)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setTextRenderingMode(textRenderingMode);
fontCascade.updateEnableKerning();
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionTextSpacingTrim(TextSpacingTrim textSpacingTrim)
{
if (m_style.fontDescription().textSpacingTrim() == textSpacingTrim)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setTextSpacingTrim(textSpacingTrim);
}
inline void BuilderState::setFontDescriptionVariantCaps(FontVariantCaps variantCaps)
{
if (m_style.fontDescription().variantCaps() == variantCaps)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantCaps(variantCaps);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantEmoji(FontVariantEmoji variantEmoji)
{
if (m_style.fontDescription().variantEmoji() == variantEmoji)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantEmoji(variantEmoji);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantPosition(FontVariantPosition variantPosition)
{
if (m_style.fontDescription().variantPosition() == variantPosition)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantPosition(variantPosition);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariationSettings(FontVariationSettings&& variationSettings)
{
if (m_style.fontDescription().variationSettings() == variationSettings)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setVariationSettings(WTFMove(variationSettings));
}
inline void BuilderState::setFontDescriptionWeight(FontSelectionValue weight)
{
if (m_style.fontDescription().weight() == weight)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setWeight(weight);
}
inline void BuilderState::setFontDescriptionWidth(FontSelectionValue width)
{
if (m_style.fontDescription().width() == width)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setWidth(width);
}
inline void BuilderState::setFontDescriptionVariantAlternates(const FontVariantAlternates& variantAlternates)
{
if (m_style.fontDescription().variantAlternates() == variantAlternates)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantAlternates(variantAlternates);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantEastAsianVariant(FontVariantEastAsianVariant variantEastAsianVariant)
{
if (m_style.fontDescription().variantEastAsianVariant() == variantEastAsianVariant)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantEastAsianVariant(variantEastAsianVariant);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantEastAsianWidth(FontVariantEastAsianWidth variantEastAsianWidth)
{
if (m_style.fontDescription().variantEastAsianWidth() == variantEastAsianWidth)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantEastAsianWidth(variantEastAsianWidth);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantEastAsianRuby(FontVariantEastAsianRuby variantEastAsianRuby)
{
if (m_style.fontDescription().variantEastAsianRuby() == variantEastAsianRuby)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantEastAsianRuby(variantEastAsianRuby);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionKeywordSize(unsigned keywordSize)
{
if (m_style.fontDescription().keywordSize() == keywordSize)
return;
m_fontDirty = true;
m_style.mutableFontDescriptionWithoutUpdate().setKeywordSize(keywordSize);
}
inline void BuilderState::setFontDescriptionVariantCommonLigatures(FontVariantLigatures variantCommonLigatures)
{
if (m_style.fontDescription().variantCommonLigatures() == variantCommonLigatures)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantCommonLigatures(variantCommonLigatures);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantDiscretionaryLigatures(FontVariantLigatures variantDiscretionaryLigatures)
{
if (m_style.fontDescription().variantDiscretionaryLigatures() == variantDiscretionaryLigatures)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantDiscretionaryLigatures(variantDiscretionaryLigatures);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantHistoricalLigatures(FontVariantLigatures variantHistoricalLigatures)
{
if (m_style.fontDescription().variantHistoricalLigatures() == variantHistoricalLigatures)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantHistoricalLigatures(variantHistoricalLigatures);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantContextualAlternates(FontVariantLigatures variantContextualAlternates)
{
if (m_style.fontDescription().variantContextualAlternates() == variantContextualAlternates)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantContextualAlternates(variantContextualAlternates);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantNumericFigure(FontVariantNumericFigure variantNumericFigure)
{
if (m_style.fontDescription().variantNumericFigure() == variantNumericFigure)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantNumericFigure(variantNumericFigure);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantNumericSpacing(FontVariantNumericSpacing variantNumericSpacing)
{
if (m_style.fontDescription().variantNumericSpacing() == variantNumericSpacing)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantNumericSpacing(variantNumericSpacing);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantNumericFraction(FontVariantNumericFraction variantNumericFraction)
{
if (m_style.fontDescription().variantNumericFraction() == variantNumericFraction)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantNumericFraction(variantNumericFraction);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantNumericOrdinal(FontVariantNumericOrdinal variantNumericOrdinal)
{
if (m_style.fontDescription().variantNumericOrdinal() == variantNumericOrdinal)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantNumericOrdinal(variantNumericOrdinal);
fontCascade.updateRequiresShaping();
}
inline void BuilderState::setFontDescriptionVariantNumericSlashedZero(FontVariantNumericSlashedZero variantNumericSlashedZero)
{
if (m_style.fontDescription().variantNumericSlashedZero() == variantNumericSlashedZero)
return;
m_fontDirty = true;
auto& fontCascade = m_style.mutableFontCascadeWithoutUpdate();
fontCascade.mutableFontDescription().setVariantNumericSlashedZero(variantNumericSlashedZero);
fontCascade.updateRequiresShaping();
}
}
}