/*
 * Copyright (C) 2020 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.
 */

#pragma once

#if ENABLE(LAYOUT_FORMATTING_CONTEXT)

#include "RenderStyleConstants.h"
#include <wtf/Forward.h>

namespace WebCore {

class RenderBlockFlow;
class RenderFlexibleBox;
class RenderInline;

namespace LayoutIntegration {

enum class AvoidanceReason : uint64_t {
    FlowIsInsideANonMultiColumnThread            = 1LLU  << 0,
    // Unused                                    = 1LLU  << 1,
    // Unused                                    = 1LLU  << 2,
    ContentIsRuby                                = 1LLU  << 3,
    FlowIsPaginated                              = 1LLU  << 4,
    FlowHasTextOverflow                          = 1LLU  << 5,
    FlowHasLineClamp                             = 1LLU  << 6,
    // Unused                                    = 1LLU  << 7,
    // Unused                                    = 1LLU  << 8,
    FlowHasNonSupportedChild                     = 1LLU  << 9,
    FlowHasUnsupportedFloat                      = 1LLU  << 10,
    // Unused                                    = 1LLU  << 11,
    // Unused                                    = 1LLU  << 12,
    FlowHasOverflowNotVisible                    = 1LLU  << 13,
    // Unused                                    = 1LLU  << 14,
    // Unused                                    = 1LLU  << 15,
    FlowHasLineBoxContainProperty                = 1LLU  << 16,
    FlowHasUnsupportedWritingMode                = 1LLU  << 17,
    // Unused                                    = 1LLU  << 18,
    // Unused                                    = 1LLU  << 19,
    FlowHasLineAlignEdges                        = 1LLU  << 20,
    FlowHasLineSnap                              = 1LLU  << 21,
    FlowHasTextEmphasisFillOrMark                = 1LLU  << 22,
    // Unused                                    = 1LLU  << 23,
    // Unused                                    = 1LLU  << 24,
    FlowHasPseudoFirstLetter                     = 1LLU  << 25,
    FlowHasTextCombine                           = 1LLU  << 26,
    // Unused                                    = 1LLU  << 27,
    // Unused                                    = 1LLU  << 28,
    FlowHasAfterWhiteSpaceLineBreak              = 1LLU  << 29,
    // Unused                                    = 1LLU  << 30,
    FlowHasSVGFont                               = 1LLU  << 31,
    FlowTextHasDirectionCharacter                = 1LLU  << 32,
    // Unused                                    = 1LLU  << 33,
    // Unused                                    = 1LLU  << 34,
    FlowTextIsCombineText                        = 1LLU  << 35,
    FlowTextIsRenderCounter                      = 1LLU  << 36,
    ContentIsRenderQuote                         = 1LLU  << 37,
    FlowTextIsTextFragment                       = 1LLU  << 38,
    FlowTextIsSVGInlineText                      = 1LLU  << 39,
    // Unused                                    = 1LLU  << 40,
    FeatureIsDisabled                            = 1LLU  << 41,
    FlowDoesNotEstablishInlineFormattingContext  = 1LLU  << 42,
    // Unused                                    = 1LLU  << 43,
    FlowHasHangingPunctuation                    = 1LLU  << 44,
    FlowHasLineBoxContainGlyphs                  = 1LLU  << 45,
    // Unused                                    = 1LLU  << 46,
    MultiColumnFlowIsNotTopLevel                 = 1LLU  << 47,
    MultiColumnFlowHasColumnSpanner              = 1LLU  << 48,
    MultiColumnFlowVerticalAlign                 = 1LLU  << 49,
    MultiColumnFlowIsFloating                    = 1LLU  << 50,
    // Unused                                    = 1LLU  << 51,
    // Unused                                    = 1LLU  << 52,
    // Unused                                    = 1LLU  << 53,
    UnsupportedFieldset                          = 1LLU  << 54,
    ChildBoxIsFloatingOrPositioned               = 1LLU  << 55,
    ContentIsSVG                                 = 1LLU  << 56,
    ChildBoxIsNotInlineBlock                     = 1LLU  << 57,
    UnsupportedImageMap                          = 1LLU  << 58,
    InlineBoxNeedsLayer                          = 1LLU  << 59,
    BoxDecorationBreakClone                      = 1LLU  << 60,
    FlowIsUnsupportedListItem                    = 1LLU  << 61,
    EndOfReasons                                 = 1LLU  << 62
};

bool canUseForLineLayout(const RenderBlockFlow&);
bool canUseForLineLayoutAfterStyleChange(const RenderBlockFlow&, StyleDifference);
bool canUseForLineLayoutAfterInlineBoxStyleChange(const RenderInline&, StyleDifference);

bool canUseForFlexLayout(const RenderFlexibleBox&);

enum class IncludeReasons { First , All };
OptionSet<AvoidanceReason> canUseForLineLayoutWithReason(const RenderBlockFlow&, IncludeReasons);

}
}

#endif
