author | Samuel Thibault <samuel.thibault@ens-lyon.org> |
Fri, 22 Feb 2019 22:12:27 +0100 | |
changeset 460716 | a2d905ec0a76ad6bfa9ec5866a702339ac7e92b0 |
parent 460715 | 3585e9dc1c5ce26c2d1d4a18a57c01c13069b952 |
child 460717 | 6c919109707924424b9fb47c10252388c5503d3e |
push id | 35597 |
push user | rmaries@mozilla.com |
push date | Sat, 23 Feb 2019 04:15:57 +0000 |
treeherder | mozilla-central@6924dd16f7b1 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jfkthame |
bugs | 919508 |
milestone | 67.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -2941,19 +2941,19 @@ static uint32_t GetEndOfTrimmedText(cons aIterator->AdvanceSkipped(-1); if (!IsTrimmableSpace(aFrag, aIterator->GetOriginalOffset(), aStyleText)) return aIterator->GetSkippedOffset() + 1; } return aStart; } nsTextFrame::TrimmedOffsets nsTextFrame::GetTrimmedOffsets( - const nsTextFragment* aFrag, bool aTrimAfter, bool aPostReflow) const { + const nsTextFragment* aFrag, TrimmedOffsetFlags aFlags) const { NS_ASSERTION(mTextRun, "Need textrun here"); - if (aPostReflow) { + if (!(aFlags & TrimmedOffsetFlags::kNotPostReflow)) { // This should not be used during reflow. We need our TEXT_REFLOW_FLAGS // to be set correctly. If our parent wasn't reflowed due to the frame // tree being too deep then the return value doesn't matter. NS_ASSERTION( !(GetStateBits() & NS_FRAME_FIRST_REFLOW) || (GetParent()->GetStateBits() & NS_FRAME_TOO_DEEP_IN_FRAME_TREE), "Can only call this on frames that have been reflowed"); NS_ASSERTION(!(GetStateBits() & NS_FRAME_IN_REFLOW), @@ -2961,24 +2961,27 @@ nsTextFrame::TrimmedOffsets nsTextFrame: } TrimmedOffsets offsets = {GetContentOffset(), GetContentLength()}; const nsStyleText* textStyle = StyleText(); // Note that pre-line newlines should still allow us to trim spaces // for display if (textStyle->WhiteSpaceIsSignificant()) return offsets; - if (!aPostReflow || (GetStateBits() & TEXT_START_OF_LINE)) { + if ((aFlags & TrimmedOffsetFlags::kNotPostReflow) || + (GetStateBits() & TEXT_START_OF_LINE)) { int32_t whitespaceCount = GetTrimmableWhitespaceCount(aFrag, offsets.mStart, offsets.mLength, 1); offsets.mStart += whitespaceCount; offsets.mLength -= whitespaceCount; } - if (aTrimAfter && (!aPostReflow || (GetStateBits() & TEXT_END_OF_LINE))) { + if (!(aFlags & TrimmedOffsetFlags::kNoTrimAfter) && + ((aFlags & TrimmedOffsetFlags::kNotPostReflow) || + (GetStateBits() & TEXT_END_OF_LINE))) { // This treats a trailing 'pre-line' newline as trimmable. That's fine, // it's actually what we want since we want whitespace before it to // be trimmed. int32_t whitespaceCount = GetTrimmableWhitespaceCount( aFrag, offsets.GetEnd() - 1, offsets.mLength, -1); offsets.mLength -= whitespaceCount; } return offsets; @@ -3707,25 +3710,28 @@ void PropertyProvider::GetHyphenationBre aBreakBefore[i] = HyphenType::AutoWithoutManualInSameWord; } } } } void PropertyProvider::InitializeForDisplay(bool aTrimAfter) { nsTextFrame::TrimmedOffsets trimmed = - mFrame->GetTrimmedOffsets(mFrag, aTrimAfter); + mFrame->GetTrimmedOffsets(mFrag, + (aTrimAfter ? nsTextFrame::TrimmedOffsetFlags::kDefaultTrimFlags : + nsTextFrame::TrimmedOffsetFlags::kNoTrimAfter)); mStart.SetOriginalOffset(trimmed.mStart); mLength = trimmed.mLength; SetupJustificationSpacing(true); } void PropertyProvider::InitializeForMeasure() { nsTextFrame::TrimmedOffsets trimmed = - mFrame->GetTrimmedOffsets(mFrag, true, false); + mFrame->GetTrimmedOffsets(mFrag, + nsTextFrame::TrimmedOffsetFlags::kNotPostReflow); mStart.SetOriginalOffset(trimmed.mStart); mLength = trimmed.mLength; SetupJustificationSpacing(false); } void PropertyProvider::SetupJustificationSpacing(bool aPostReflow) { MOZ_ASSERT(mLength != INT32_MAX, "Can't call this with undefined length"); @@ -3733,17 +3739,19 @@ void PropertyProvider::SetupJustificatio return; } gfxSkipCharsIterator start(mStart), end(mStart); // We can't just use our mLength here; when InitializeForDisplay is // called with false for aTrimAfter, we still shouldn't be assigning // justification space to any trailing whitespace. nsTextFrame::TrimmedOffsets trimmed = - mFrame->GetTrimmedOffsets(mFrag, true, aPostReflow); + mFrame->GetTrimmedOffsets(mFrag, + (aPostReflow ? nsTextFrame::TrimmedOffsetFlags::kDefaultTrimFlags : + nsTextFrame::TrimmedOffsetFlags::kNotPostReflow)); end.AdvanceOriginal(trimmed.mLength); gfxSkipCharsIterator realEnd(end); Range range(uint32_t(start.GetOriginalOffset()), uint32_t(end.GetOriginalOffset())); nsTArray<JustificationAssignment> assignments; JustificationInfo info = ComputeJustification(range, &assignments); @@ -7699,17 +7707,17 @@ nsresult nsTextFrame::GetChildFrameConta nsIFrame::FrameSearchResult nsTextFrame::PeekOffsetNoAmount(bool aForward, int32_t* aOffset) { NS_ASSERTION(aOffset && *aOffset <= GetContentLength(), "aOffset out of range"); gfxSkipCharsIterator iter = EnsureTextRun(nsTextFrame::eInflated); if (!mTextRun) return CONTINUE_EMPTY; - TrimmedOffsets trimmed = GetTrimmedOffsets(mContent->GetText(), true); + TrimmedOffsets trimmed = GetTrimmedOffsets(mContent->GetText()); // Check whether there are nonskipped characters in the trimmmed range return (iter.ConvertOriginalToSkipped(trimmed.GetEnd()) > iter.ConvertOriginalToSkipped(trimmed.mStart)) ? FOUND : CONTINUE; } /** @@ -7822,17 +7830,18 @@ nsIFrame::FrameSearchResult nsTextFrame: if (selectStyle == StyleUserSelect::All) { return CONTINUE_UNSELECTABLE; } } gfxSkipCharsIterator iter = EnsureTextRun(nsTextFrame::eInflated); if (!mTextRun) return CONTINUE_EMPTY; - TrimmedOffsets trimmed = GetTrimmedOffsets(mContent->GetText(), false); + TrimmedOffsets trimmed = GetTrimmedOffsets(mContent->GetText(), + TrimmedOffsetFlags::kNoTrimAfter); // A negative offset means "end of frame". int32_t startOffset = GetContentOffset() + (*aOffset < 0 ? contentLength : *aOffset); if (!aForward) { // If at the beginning of the line, look at the previous continuation for (int32_t i = std::min(trimmed.GetEnd(), startOffset) - 1; @@ -7955,17 +7964,17 @@ ClusterIterator::ClusterIterator(nsTextF mIterator = aTextFrame->EnsureTextRun(nsTextFrame::eInflated); if (!aTextFrame->GetTextRun(nsTextFrame::eInflated)) { mDirection = 0; // signal failure return; } mIterator.SetOriginalOffset(aPosition); mFrag = aTextFrame->GetContent()->GetText(); - mTrimmed = aTextFrame->GetTrimmedOffsets(mFrag, true); + mTrimmed = aTextFrame->GetTrimmedOffsets(mFrag); int32_t textOffset = aTextFrame->GetContentOffset(); int32_t textLen = aTextFrame->GetContentLength(); if (!mWordBreaks.AppendElements(textLen + 1)) { mDirection = 0; // signal failure return; } memset(mWordBreaks.Elements(), false, (textLen + 1) * sizeof(bool)); @@ -9557,17 +9566,17 @@ nsTextFrame::TrimOutput nsTextFrame::Tri gfxSkipCharsIterator start = EnsureTextRun(nsTextFrame::eInflated, aDrawTarget); NS_ENSURE_TRUE(mTextRun, result); uint32_t trimmedStart = start.GetSkippedOffset(); const nsTextFragment* frag = mContent->GetText(); - TrimmedOffsets trimmed = GetTrimmedOffsets(frag, true); + TrimmedOffsets trimmed = GetTrimmedOffsets(frag); gfxSkipCharsIterator trimmedEndIter = start; const nsStyleText* textStyle = StyleText(); gfxFloat delta = 0; uint32_t trimmedEnd = trimmedEndIter.ConvertOriginalToSkipped(trimmed.GetEnd()); if (!(GetStateBits() & TEXT_TRIMMED_TRAILING_WHITESPACE) && trimmed.GetEnd() < GetContentEnd()) { @@ -9763,17 +9772,19 @@ nsIFrame::RenderedText nsTextFrame::GetR } else { // Weird situation where we have a line layout without a block. // No soft breaks occur in this situation. trimAfter = true; } // Skip to the start of the text run, past ignored chars at start of line TrimmedOffsets trimmedOffsets = - textFrame->GetTrimmedOffsets(textFrag, trimAfter); + textFrame->GetTrimmedOffsets(textFrag, + (trimAfter ? TrimmedOffsetFlags::kDefaultTrimFlags : + TrimmedOffsetFlags::kNoTrimAfter)); bool trimmedSignificantNewline = trimmedOffsets.GetEnd() < GetContentEnd() && HasSignificantTerminalNewline(); uint32_t skippedToRenderedStringOffset = offsetInRenderedString - tmpIter.ConvertOriginalToSkipped(trimmedOffsets.mStart); uint32_t nextOffsetInRenderedString = tmpIter.ConvertOriginalToSkipped(trimmedOffsets.GetEnd()) + @@ -10102,11 +10113,12 @@ bool nsTextFrame::HasNonSuppressedText() NS_FRAME_FIRST_REFLOW | NS_FRAME_IN_REFLOW)) { return true; } if (!GetTextRun(nsTextFrame::eInflated)) { return false; } - TrimmedOffsets offsets = GetTrimmedOffsets(mContent->GetText(), false); + TrimmedOffsets offsets = GetTrimmedOffsets(mContent->GetText(), + TrimmedOffsetFlags::kNoTrimAfter); return offsets.mLength != 0; }
--- a/layout/generic/nsTextFrame.h +++ b/layout/generic/nsTextFrame.h @@ -568,18 +568,23 @@ class nsTextFrame : public nsFrame { // Get the DOM content range mapped by this frame after excluding // whitespace subject to start-of-line and end-of-line trimming. // The textrun must have been created before calling this. struct TrimmedOffsets { int32_t mStart; int32_t mLength; int32_t GetEnd() const { return mStart + mLength; } }; - TrimmedOffsets GetTrimmedOffsets(const nsTextFragment* aFrag, bool aTrimAfter, - bool aPostReflow = true) const; + enum class TrimmedOffsetFlags : uint8_t { + kDefaultTrimFlags = 0, + kNotPostReflow = 1 << 0, + kNoTrimAfter = 1 << 1 + }; + TrimmedOffsets GetTrimmedOffsets(const nsTextFragment* aFrag, + TrimmedOffsetFlags aFlags = TrimmedOffsetFlags::kDefaultTrimFlags) const; // Similar to Reflow(), but for use from nsLineLayout void ReflowText(nsLineLayout& aLineLayout, nscoord aAvailableWidth, DrawTarget* aDrawTarget, ReflowOutput& aMetrics, nsReflowStatus& aStatus); bool IsFloatingFirstLetterChild() const; @@ -801,9 +806,11 @@ class nsTextFrame : public nsFrame { void UpdateIteratorFromOffset(const PropertyProvider& aProperties, int32_t& aInOffset, gfxSkipCharsIterator& aIter); nsPoint GetPointFromIterator(const gfxSkipCharsIterator& aIter, PropertyProvider& aProperties); }; +MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(nsTextFrame::TrimmedOffsetFlags) + #endif
--- a/layout/svg/SVGTextFrame.cpp +++ b/layout/svg/SVGTextFrame.cpp @@ -979,17 +979,17 @@ void TextRenderedRun::GetClipEdges(nscoo // Get the offset/length of the whole nsTextFrame. uint32_t frameOffset = mFrame->GetContentOffset(); uint32_t frameLength = mFrame->GetContentLength(); // Trim the whole-nsTextFrame offset/length to remove any leading/trailing // white space, as the nsTextFrame when painting does not include them when // interpreting clip edges. nsTextFrame::TrimmedOffsets trimmedOffsets = - mFrame->GetTrimmedOffsets(mFrame->GetContent()->GetText(), true); + mFrame->GetTrimmedOffsets(mFrame->GetContent()->GetText()); TrimOffsets(frameOffset, frameLength, trimmedOffsets); // Convert the trimmed whole-nsTextFrame offset/length into skipped // characters. Range frameRange = ConvertOriginalToSkipped(it, frameOffset, frameLength); // Measure the advance width in the text run between the start of // frame's content and the start of the rendered run's content, @@ -1884,17 +1884,17 @@ TextRenderedRun TextRenderedRunIterator: baseline = GetBaselinePosition( frame, frame->GetTextRun(nsTextFrame::eInflated), mFrameIterator.DominantBaseline(), mFontSizeScaleFactor); // Trim the offset/length to remove any leading/trailing white space. uint32_t untrimmedOffset = offset; uint32_t untrimmedLength = length; nsTextFrame::TrimmedOffsets trimmedOffsets = - frame->GetTrimmedOffsets(frame->GetContent()->GetText(), true); + frame->GetTrimmedOffsets(frame->GetContent()->GetText()); TrimOffsets(offset, length, trimmedOffsets); charIndex += offset - untrimmedOffset; // Get the position and rotation of the character that begins this // rendered run. pt = Root()->mPositions[charIndex].mPosition; rotate = Root()->mPositions[charIndex].mAngle; @@ -2366,17 +2366,18 @@ bool CharIterator::IsOriginalCharTrimmed // Since we do a lot of trim checking, we cache the trimmed offsets and // lengths while we are in the same frame. mFrameForTrimCheck = TextFrame(); uint32_t offset = mFrameForTrimCheck->GetContentOffset(); uint32_t length = mFrameForTrimCheck->GetContentLength(); nsIContent* content = mFrameForTrimCheck->GetContent(); nsTextFrame::TrimmedOffsets trim = mFrameForTrimCheck->GetTrimmedOffsets( content->GetText(), - /* aTrimAfter */ true, mPostReflow); + (mPostReflow ? nsTextFrame::TrimmedOffsetFlags::kDefaultTrimFlags : + nsTextFrame::TrimmedOffsetFlags::kNotPostReflow)); TrimOffsets(offset, length, trim); mTrimmedOffset = offset; mTrimmedLength = length; } // A character is trimmed if it is outside the mTrimmedOffset/mTrimmedLength // range and it is not a significant newline character. uint32_t index = mSkipCharsIterator.GetOriginalOffset(); @@ -3819,18 +3820,17 @@ nsresult SVGTextFrame::GetSubStringLengt const uint32_t untrimmedOffset = frame->GetContentOffset(); const uint32_t untrimmedLength = frame->GetContentEnd() - untrimmedOffset; // Trim the offset/length to remove any leading/trailing white space. uint32_t trimmedOffset = untrimmedOffset; uint32_t trimmedLength = untrimmedLength; nsTextFrame::TrimmedOffsets trimmedOffsets = frame->GetTrimmedOffsets(frame->GetContent()->GetText(), - /* aTrimAfter */ true, - /* aPostReflow */ false); + nsTextFrame::TrimmedOffsetFlags::kNotPostReflow); TrimOffsets(trimmedOffset, trimmedLength, trimmedOffsets); textElementCharIndex += trimmedOffset - untrimmedOffset; if (textElementCharIndex >= charnum + nchars) { break; // we're past the end of the substring } @@ -4428,17 +4428,17 @@ void SVGTextFrame::DetermineCharPosition // Any characters not in a frame, e.g. when display:none. for (uint32_t i = 0; i < frit.UndisplayedCharacters(); i++) { aPositions.AppendElement(position); } // Any white space characters trimmed at the start of the line of text. nsTextFrame::TrimmedOffsets trimmedOffsets = - frame->GetTrimmedOffsets(frame->GetContent()->GetText(), true); + frame->GetTrimmedOffsets(frame->GetContent()->GetText()); while (it.GetOriginalOffset() < trimmedOffsets.mStart) { aPositions.AppendElement(position); it.AdvanceOriginal(1); } // If a ligature was started in the previous frame, we should record // the ligature's start position, not any partial position. while (it.GetOriginalOffset() < frame->GetContentEnd() &&