From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- layout/generic/nsTextPaintStyle.h | 167 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 layout/generic/nsTextPaintStyle.h (limited to 'layout/generic/nsTextPaintStyle.h') diff --git a/layout/generic/nsTextPaintStyle.h b/layout/generic/nsTextPaintStyle.h new file mode 100644 index 0000000000..a99ee9fd46 --- /dev/null +++ b/layout/generic/nsTextPaintStyle.h @@ -0,0 +1,167 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsTextPaintStyle_h__ +#define nsTextPaintStyle_h__ + +#include "mozilla/Attributes.h" +#include "mozilla/ComputedStyle.h" +#include "mozilla/EnumeratedArray.h" +#include "mozilla/Span.h" + +#include "nsAtomHashKeys.h" +#include "nsISelectionController.h" +#include "nsTHashMap.h" + +class nsTextFrame; +class nsPresContext; + +namespace mozilla { +enum class StyleTextDecorationStyle : uint8_t; +} + +/** + * This helper object computes colors used for painting, and also IME + * underline information. The data is computed lazily and cached as necessary. + * These live for just the duration of one paint operation. + */ +class MOZ_STACK_CLASS nsTextPaintStyle { + using ComputedStyle = mozilla::ComputedStyle; + using SelectionType = mozilla::SelectionType; + using StyleTextDecorationStyle = mozilla::StyleTextDecorationStyle; + using StyleSimpleShadow = mozilla::StyleSimpleShadow; + + public: + explicit nsTextPaintStyle(nsTextFrame* aFrame); + + void SetResolveColors(bool aResolveColors) { + mResolveColors = aResolveColors; + } + + nscolor GetTextColor(); + + // SVG text has its own painting process, so we should never get its stroke + // property from here. + nscolor GetWebkitTextStrokeColor(); + float GetWebkitTextStrokeWidth(); + + // Index used to look up styles for different types of selection. + enum class SelectionStyleIndex : uint8_t { + RawInput = 0, + SelRawText, + ConvText, + SelConvText, + SpellChecker, + // Not an actual enum value; used to size the array of styles. + Count, + }; + + /** + * Compute the colors for normally-selected text. Returns false if + * the normal selection is not being displayed. + */ + bool GetSelectionColors(nscolor* aForeColor, nscolor* aBackColor); + void GetHighlightColors(nscolor* aForeColor, nscolor* aBackColor); + // Computes colors for custom highlights. + // Returns false if there are no rules associated with `aHighlightName`. + bool GetCustomHighlightTextColor(nsAtom* aHighlightName, nscolor* aForeColor); + bool GetCustomHighlightBackgroundColor(nsAtom* aHighlightName, + nscolor* aBackColor); + void GetURLSecondaryColor(nscolor* aForeColor); + void GetIMESelectionColors(SelectionStyleIndex aIndex, nscolor* aForeColor, + nscolor* aBackColor); + // if this returns false, we don't need to draw underline. + bool GetSelectionUnderlineForPaint(SelectionStyleIndex aIndex, + nscolor* aLineColor, float* aRelativeSize, + StyleTextDecorationStyle* aStyle); + + // if this returns false, we don't need to draw underline. + static bool GetSelectionUnderline(nsIFrame*, SelectionStyleIndex aIndex, + nscolor* aLineColor, float* aRelativeSize, + StyleTextDecorationStyle* aStyle); + + // if this returns false, no text-shadow was specified for the selection + // and the *aShadow parameter was not modified. + bool GetSelectionShadow(mozilla::Span* aShadows); + + nsPresContext* PresContext() const { return mPresContext; } + + static SelectionStyleIndex GetUnderlineStyleIndexForSelectionType( + SelectionType aSelectionType) { + switch (aSelectionType) { + case SelectionType::eIMERawClause: + return SelectionStyleIndex::RawInput; + case SelectionType::eIMESelectedRawClause: + return SelectionStyleIndex::SelRawText; + case SelectionType::eIMEConvertedClause: + return SelectionStyleIndex::ConvText; + case SelectionType::eIMESelectedClause: + return SelectionStyleIndex::SelConvText; + case SelectionType::eSpellCheck: + return SelectionStyleIndex::SpellChecker; + default: + NS_WARNING("non-IME selection type"); + return SelectionStyleIndex::RawInput; + } + } + + nscolor GetSystemFieldForegroundColor(); + nscolor GetSystemFieldBackgroundColor(); + + protected: + nsTextFrame* mFrame; + nsPresContext* mPresContext; + bool mInitCommonColors; + bool mInitSelectionColorsAndShadow; + bool mResolveColors; + + // Selection data + + nscolor mSelectionTextColor; + nscolor mSelectionBGColor; + RefPtr mSelectionPseudoStyle; + nsTHashMap, RefPtr> + mCustomHighlightPseudoStyles; + + // Common data + + int32_t mSufficientContrast; + nscolor mFrameBackgroundColor; + nscolor mSystemFieldForegroundColor; + nscolor mSystemFieldBackgroundColor; + + // selection colors and underline info, the colors are resolved colors if + // mResolveColors is true (which is the default), i.e., the foreground color + // and background color are swapped if it's needed. And also line color will + // be resolved from them. + struct nsSelectionStyle { + nscolor mTextColor; + nscolor mBGColor; + nscolor mUnderlineColor; + StyleTextDecorationStyle mUnderlineStyle; + float mUnderlineRelativeSize; + }; + mozilla::EnumeratedArray> + mSelectionStyle; + + // Color initializations + void InitCommonColors(); + bool InitSelectionColorsAndShadow(); + + nsSelectionStyle* SelectionStyle(SelectionStyleIndex aIndex); + nsSelectionStyle InitSelectionStyle(SelectionStyleIndex aIndex); + + // Ensures sufficient contrast between the frame background color and the + // selection background color, and swaps the selection text and background + // colors accordingly. + bool EnsureSufficientContrast(nscolor* aForeColor, nscolor* aBackColor); + + nscolor GetResolvedForeColor(nscolor aColor, nscolor aDefaultForeColor, + nscolor aBackColor); +}; + +#endif // nsTextPaintStyle_h__ -- cgit v1.2.3