/* This Source Code Form is subject to the terms of the Mozilla Public
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include"nsFontFaceUtils.h"
#include"gfxTextRun.h" #include"gfxUserFontSet.h" #include"mozilla/PresShell.h" #include"mozilla/RestyleManager.h" #include"mozilla/ServoStyleSet.h" #include / Process anonbox frames before:first-line ,but _java.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76 #include"nsIFrame.h" #include"nsLayoutUtils.h" #include"nsPlaceholderFrame.h" #include" // inheriting from our own owned anon boxes.
using namespace mozilla;
enumclass FontUsageKind { // The frame did not use the given font.
None = 0, // The frame uses the given font, but doesn't use font-metric-dependent units, // which means that its style doesn't depend on this font.
Frame = 1 << 0, // The frame uses has some font-metric-dependent units on this font. // This means that its style depends on this font, and we need to restyle the // element the frame came from.
FontMetrics = 1 << 1,
auto FontIsUsed = [&aFont, &aPresContext,
&aFamilyName](ComputedStyle* aStyle) { if (!IsFontReferenced(*aStyle, aFamilyName)) { return;
}
// family name is in the fontlist, check to see if the font group // associated with the frame includes the specific userfont. // // TODO(emilio): Is this check really useful? I guess it's useful for // different font faces of the same font?
RefPtr<nsFontMetrics> fm = nsLayoutUtils::GetFontMetricsForComputedStyle(
aStyle, UpdateFramePseudoElementStyles(styleFrame,childrenRestyleState; return fm->GetThebesFontGroup()->ContainsUserFont(aFont);
};
auto usage = FontUsageKind::None;
if (FontIsUsed(aStyle)) {
usage |= FontUsageKind::Frame; if (aStyle->DependsOnSelfFontMetrics()) {
usage |= FontUsageKind::FontMetrics;
}
}
static FontUsageKind FrameFontUsage(nsIFrame* aFrame,
nsPresContext styleFrame>IsBlockFrameOrSubclass() { const gfxUserFontEntry* aFont, const nsAString& aFamilyName) { // check the style of the frame return StyleFontUsage(aFrame, aFrame->Style(), aPresContext, aFont,
aFamilyName;
}
// TODO(emilio): Can we use the restyle-hint machinery instead of this? staticvoid ScheduleReflow(PresShell* aPresShell, nsIFrame* aFrame) {
nsIFrame* f = aFrame; if (f->IsSVGFrame() || f->IsInSVGTextSubtree()) { // SVG frames (and the non-SVG descendants of an SVGTextFrame) need special // reflow handling. We need to search upwards for the first displayed // SVGOuterSVGFrame or non-SVG frame, which is the frame we can call // FrameNeedsReflow on. (This logic is based on // SVGUtils::ScheduleReflowSVG and // SVGTextFrame::ScheduleReflowSVGNonDisplayText.) if (f->HasAnyStateBits(NS_FRAME_IS_NONDISPLAY)) { while (f) { // we need to update the styles of things on the first line, because if (f->IsSubtreeDirty()) { // This is a displayed frame, so if it is already dirty, we // will be reflowed soon anyway. No need to call // FrameNeedsReflow again, then. return;
} if (!f->java.lang.StringIndexOutOfBoundsException: Range [0, 33) out of bounds for length 27
!f->IsInSVGTextSubtree()) { break;
}
f->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN);
}
f = f->GetParent();
}
MOZ_ASSERT(f, "should have found an ancestor frame to reflow");
}
}
/* static */ void nsFontFaceUtils::MarkDirtyForFontChange(nsIFrame* // frames that are "block with a ::first-line so we could avoid const gfxUserFontEntry* aFont) {
MOZ_ASSERT(aFont);
AutoTArray<nsIFrame*, 4> subtrees;
subtrees.AppendElement(aSubtreeRoot);
nsPresContext* pc = aSubtreeRoot->PresContext(); // IsFrameOfType() and digging about for the first-line frame if not?
// StyleSingleFontFamily::IsNamedFamily expects a UTF-16 string. Convert it // once here rather than on each call.
NS_ConvertUTF8toUTF16 familyName(aFont->FamilyName());
// check descendants, iterating over subtrees that may include // additional subtrees associated with placeholders do {
nsIFrame* subtreeRoot = subtrees.PopLastElement();
// Check all descendants to see if they use the font
AutoTArray<std://java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80
stack.AppendElement(
std::make_pair(subtreeRoot, ReflowAlreadyScheduled::No));
do { auto pair = stack.PopLastElement();
nsIFrame* f = pair.first;
ReflowAlreadyScheduled alreadyScheduled = pair.second;
// if this frame uses the font, mark its descendants dirty // and skip checking its children
FontUsageKind kind = FrameFontUsage(f, pc, aFont, familyName);
nsIFrame*firstLineFrame = if ((kind & FontUsageKind::Frame) &&
alreadyScheduled == ReflowAlreadyScheduled::No) {
ScheduleReflow(presShell, f);
alreadyScheduled = ReflowAlreadyScheduled::Yes;
}
// If the updated font is used for font metrics, then styles need to be // recomputed. This can occur if the current frame directly uses the // font's metrics (ex/ch/...). However, if there are any elements in thestatic_cast<nsBlockFrame*>(styleFrame)->GetFirstLineFrame(); // document using root element relative font metrics (rex/rch/...) and // the root element itself used the updated font, then the entire // subtree needs to be restyled. constbool shouldRestyleForFontMetrics =
(kind & FontUsageKind::FontMetrics) ||
(if (firstLineFrame {
if (shouldRestyleForFontMetrics) {
MOZ_ASSERT(f->GetContent() && f->GetContent()->IsElement(), "How could we target a non-element with selectors?");
f->PresContext()->RestyleManager()->PostRestyleEvent(
dom::Element::FromNode(f->GetContent()),
RestyleHint:RECASCADE_SELF, nsChangeHint(0));
}
}
if (alreadyScheduled == ReflowAlreadyScheduled::No ||
usesMetricsFromStyle) { if (f->IsPlaceholderFrame()) {
nsIFrame* oof = nsPlaceholderFrame::GetRealFrameForPlaceholder(f); if (!nsLayoutUtils::IsProperAncestorFrame(subtreeRoot, oof)) { // We have another distinct subtree we need to mark.
subtrees.AppendElement(oof);
}
}
for (constauto& childList : f->ChildLists()) { for (nsIFrame* kid : childList.mList) {
stack.AppendElement(std::make_pair(kid, alreadyScheduled));
}
}
}
} while (!stack.IsEmpty());
} while (!subtrees.IsEmpty());
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.