/* * Copyright (C) 2013 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. */ #include "config.h" #include "SimpleLineLayout.h" #include "FontCache.h" #include "Frame.h" #include "GraphicsContext.h" #include "HTMLTextFormControlElement.h" #include "HitTestLocation.h" #include "HitTestRequest.h" #include "HitTestResult.h" #include "InlineTextBox.h" #include "LineWidth.h" #include "Logging.h" #include "PaintInfo.h" #include "RenderBlockFlow.h" #include "RenderChildIterator.h" #include "RenderLineBreak.h" #include "RenderStyle.h" #include "RenderText.h" #include "RenderTextControl.h" #include "RenderView.h" #include "Settings.h" #include "SimpleLineLayoutFlowContents.h" #include "SimpleLineLayoutFunctions.h" #include "SimpleLineLayoutTextFragmentIterator.h" #include "Text.h" #include "TextPaintStyle.h" #include "TextStream.h" namespace WebCore { namespace SimpleLineLayout { #ifndef NDEBUG void printSimpleLineLayoutCoverage(); void printSimpleLineLayoutBlockList(); void toggleSimpleLineLayout(); #endif enum AvoidanceReason_ : uint64_t { FlowIsInsideRegion = 1LLU << 0, FlowHasHorizonalWritingMode = 1LLU << 1, FlowHasOutline = 1LLU << 2, FlowIsRuby = 1LLU << 3, FlowIsPaginated = 1LLU << 4, FlowHasTextOverflow = 1LLU << 5, FlowIsDepricatedFlexBox = 1LLU << 6, FlowParentIsPlaceholderElement = 1LLU << 7, FlowParentIsTextAreaWithWrapping = 1LLU << 8, FlowHasNonSupportedChild = 1LLU << 9, FlowHasUnsupportedFloat = 1LLU << 10, FlowHasUnsupportedUnderlineDecoration = 1LLU << 11, FlowIsJustifyAligned = 1LLU << 12, FlowHasOverflowVisible = 1LLU << 13, FlowIsNotLTR = 1LLU << 14, FlowHasLineBoxContainProperty = 1LLU << 15, FlowIsNotTopToBottom = 1LLU << 16, FlowHasLineBreak = 1LLU << 17, FlowHasNonNormalUnicodeBiDi = 1LLU << 18, FlowHasRTLOrdering = 1LLU << 19, FlowHasLineAlignEdges = 1LLU << 20, FlowHasLineSnap = 1LLU << 21, FlowHasHypensAuto = 1LLU << 22, FlowHasTextEmphasisFillOrMark = 1LLU << 23, FlowHasTextShadow = 1LLU << 24, FlowHasPseudoFirstLine = 1LLU << 25, FlowHasPseudoFirstLetter = 1LLU << 26, FlowHasTextCombine = 1LLU << 27, FlowHasTextFillBox = 1LLU << 28, FlowHasBorderFitLines = 1LLU << 29, FlowHasNonAutoLineBreak = 1LLU << 30, FlowHasNonAutoTrailingWord = 1LLU << 31, FlowHasSVGFont = 1LLU << 32, FlowTextIsEmpty = 1LLU << 33, FlowTextHasNoBreakSpace = 1LLU << 34, FlowTextHasSoftHyphen = 1LLU << 35, FlowTextHasDirectionCharacter = 1LLU << 36, FlowIsMissingPrimaryFont = 1LLU << 37, FlowFontIsMissingGlyph = 1LLU << 38, FlowTextIsCombineText = 1LLU << 39, FlowTextIsRenderCounter = 1LLU << 40, FlowTextIsRenderQuote = 1LLU << 41, FlowTextIsTextFragment = 1LLU << 42, FlowTextIsSVGInlineText = 1LLU << 43, FlowFontIsNotSimple = 1LLU << 44, FeatureIsDisabled = 1LLU << 45, FlowHasNoParent = 1LLU << 46, FlowHasNoChild = 1LLU << 47, FlowChildIsSelected = 1LLU << 48, EndOfReasons = 1LLU << 49 }; const unsigned NoReason = 0; typedef uint64_t AvoidanceReason; typedef uint64_t AvoidanceReasonFlags; enum class IncludeReasons { First , All }; #ifndef NDEBUG #define SET_REASON_AND_RETURN_IF_NEEDED(reason, reasons, includeReasons) { \ reasons |= reason; \ if (includeReasons == IncludeReasons::First) \ return reasons; \ } #else #define SET_REASON_AND_RETURN_IF_NEEDED(reason, reasons, includeReasons) { \ ASSERT_UNUSED(includeReasons, includeReasons == IncludeReasons::First); \ reasons |= reason; \ return reasons; \ } #endif template static AvoidanceReasonFlags canUseForText(const CharacterType* text, unsigned length, const Font& font, IncludeReasons includeReasons) { AvoidanceReasonFlags reasons = { }; // FIXME: