haikuwebkit/Source/WebCore/display/css/DisplayBoxDecorationData.h

124 lines
4.5 KiB
C++

/*
* 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 "Color.h"
#include "DisplayFillLayerImageGeometry.h"
#include "FloatRoundedRect.h"
#include "RectEdges.h"
#include <utility>
#include <wtf/IsoMalloc.h>
namespace WebCore {
class RenderStyle;
namespace Layout {
class Box;
class BoxGeometry;
}
namespace Display {
// Pixel-snapped border edge.
class BorderEdge {
public:
BorderEdge() = default;
BorderEdge(float width, float innerWidth, float outerWidth, Color, BorderStyle, bool isTransparent, bool isPresent);
float width() const { return m_width; }
BorderStyle style() const { return m_style; }
const Color& color() const { return m_color; }
bool isTransparent() const { return m_isTransparent; }
bool isPresent() const { return m_isPresent; }
bool hasVisibleColorAndStyle() const { return m_style > BorderStyle::Hidden && !m_isTransparent; }
bool shouldRender() const { return widthForPainting() && hasVisibleColorAndStyle(); }
bool presentButInvisible() const { return widthForPainting() && !hasVisibleColorAndStyle(); }
float widthForPainting() const { return m_isPresent ? m_width : 0; }
float innerWidth() const { return m_innerWidth; }
float outerWidth() const { return m_outerWidth; }
bool obscuresBackground() const;
bool obscuresBackgroundEdge(float scale) const;
private:
Color m_color;
float m_width { 0 };
float m_innerWidth { 0 }; // Only used for double borders.
float m_outerWidth { 0 }; // Only used for double borders.
BorderStyle m_style { BorderStyle::Hidden };
bool m_isTransparent { false };
bool m_isPresent { false };
};
RectEdges<BorderEdge> calculateBorderEdges(const RenderStyle&, float pixelSnappingFactor, bool includeLogicalLeftEdge = true, bool includeLogicalRightEdge = true);
std::pair<BoxSide, BoxSide> adjacentSidesForSide(BoxSide);
inline RectEdges<float> borderWidths(const RectEdges<BorderEdge>& edges)
{
return {
edges.top().width(),
edges.right().width(),
edges.bottom().width(),
edges.left().width()
};
}
// Per-box data with pixel-snapped geometry for background images and border-radius.
DECLARE_ALLOCATOR_WITH_HEAP_IDENTIFIER(BoxDecorationData);
class BoxDecorationData {
WTF_MAKE_FAST_ALLOCATED_WITH_HEAP_IDENTIFIER(BoxDecorationData);
public:
BoxDecorationData();
const Vector<FillLayerImageGeometry, 1> backgroundImageGeometry() const { return m_backgroundImageGeometry; }
void setBackgroundImageGeometry(Vector<FillLayerImageGeometry, 1>&& geometry) { m_backgroundImageGeometry = WTFMove(geometry); }
const RectEdges<BorderEdge>& borderEdges() const { return m_borderEdges; }
void setBorderEdges(RectEdges<BorderEdge>&& edges) { m_borderEdges = WTFMove(edges); }
bool hasBorderImage() const { return false; } // FIXME: Implement border-image.
bool hasBorder() const;
bool borderObscuresBackground() const;
bool borderObscuresBackgroundEdge(const FloatSize& contextScale) const;
private:
Vector<FillLayerImageGeometry, 1> m_backgroundImageGeometry;
RectEdges<BorderEdge> m_borderEdges;
};
} // namespace Display
} // namespace WebCore
#endif // ENABLE(LAYOUT_FORMATTING_CONTEXT)