зеркало из https://github.com/mozilla/gecko-dev.git
159 строки
5.3 KiB
C++
159 строки
5.3 KiB
C++
/* -*- 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/Span.h"
|
|
#include "mozilla/SVGUtils.h"
|
|
|
|
#include "nsAtom.h"
|
|
#include "nsISelectionController.h"
|
|
#include "nsTHashMap.h"
|
|
|
|
class nsTextFrame;
|
|
class nsPresContext;
|
|
|
|
/**
|
|
* 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();
|
|
|
|
/**
|
|
* 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 GetCustomHighlightColors(const nsAtom* aHighlightName,
|
|
nscolor* aForeColor, nscolor* aBackColor);
|
|
void GetURLSecondaryColor(nscolor* aForeColor);
|
|
void GetIMESelectionColors(int32_t aIndex, nscolor* aForeColor,
|
|
nscolor* aBackColor);
|
|
// if this returns false, we don't need to draw underline.
|
|
bool GetSelectionUnderlineForPaint(int32_t aIndex, nscolor* aLineColor,
|
|
float* aRelativeSize,
|
|
StyleTextDecorationStyle* aStyle);
|
|
|
|
// if this returns false, we don't need to draw underline.
|
|
static bool GetSelectionUnderline(nsIFrame*, int32_t 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<const StyleSimpleShadow>* aShadows);
|
|
|
|
nsPresContext* PresContext() const { return mPresContext; }
|
|
|
|
enum {
|
|
eIndexRawInput = 0,
|
|
eIndexSelRawText,
|
|
eIndexConvText,
|
|
eIndexSelConvText,
|
|
eIndexSpellChecker
|
|
};
|
|
|
|
static int32_t GetUnderlineStyleIndexForSelectionType(
|
|
SelectionType aSelectionType) {
|
|
switch (aSelectionType) {
|
|
case SelectionType::eIMERawClause:
|
|
return eIndexRawInput;
|
|
case SelectionType::eIMESelectedRawClause:
|
|
return eIndexSelRawText;
|
|
case SelectionType::eIMEConvertedClause:
|
|
return eIndexConvText;
|
|
case SelectionType::eIMESelectedClause:
|
|
return eIndexSelConvText;
|
|
case SelectionType::eSpellCheck:
|
|
return eIndexSpellChecker;
|
|
default:
|
|
NS_WARNING("non-IME selection type");
|
|
return eIndexRawInput;
|
|
}
|
|
}
|
|
|
|
nscolor GetSystemFieldForegroundColor();
|
|
nscolor GetSystemFieldBackgroundColor();
|
|
|
|
protected:
|
|
nsTextFrame* mFrame;
|
|
nsPresContext* mPresContext;
|
|
bool mInitCommonColors;
|
|
bool mInitSelectionColorsAndShadow;
|
|
bool mResolveColors;
|
|
|
|
// Selection data
|
|
|
|
nscolor mSelectionTextColor;
|
|
nscolor mSelectionBGColor;
|
|
RefPtr<ComputedStyle> mSelectionPseudoStyle;
|
|
nsTHashMap<RefPtr<const nsAtom>, RefPtr<ComputedStyle>>
|
|
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 {
|
|
bool mInit;
|
|
nscolor mTextColor;
|
|
nscolor mBGColor;
|
|
nscolor mUnderlineColor;
|
|
StyleTextDecorationStyle mUnderlineStyle;
|
|
float mUnderlineRelativeSize;
|
|
};
|
|
nsSelectionStyle mSelectionStyle[5];
|
|
|
|
// Color initializations
|
|
void InitCommonColors();
|
|
bool InitSelectionColorsAndShadow();
|
|
|
|
nsSelectionStyle* GetSelectionStyle(int32_t aIndex);
|
|
void InitSelectionStyle(int32_t 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__
|