blob: 63e30be035a7cdec83b69ce058f397b13f279358 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BoxBorderPainter_h
#define BoxBorderPainter_h
#include "core/layout/LayoutBoxModelObject.h"
#include "core/style/BorderEdge.h"
#include "platform/geometry/FloatRoundedRect.h"
#include "platform/heap/Heap.h"
namespace blink {
class ComputedStyle;
class IntRect;
class LayoutBox;
class LayoutRect;
struct PaintInfo;
class BoxBorderPainter {
STACK_ALLOCATED();
public:
BoxBorderPainter(const LayoutRect& borderRect, const ComputedStyle&, const IntRect& clipRect,
BackgroundBleedAvoidance, bool includeLogicalLeftEdge, bool includeLogicalRightEdge);
BoxBorderPainter(const ComputedStyle&, const LayoutRect& outer, const LayoutRect& inner,
const BorderEdge& uniformEdgeInfo);
void paintBorder(const PaintInfo&, const LayoutRect& borderRect) const;
private:
struct ComplexBorderInfo;
enum MiterType {
NoMiter,
SoftMiter, // Anti-aliased
HardMiter, // Not anti-aliased
};
void computeBorderProperties();
BorderEdgeFlags paintOpacityGroup(GraphicsContext*, const ComplexBorderInfo&, unsigned index,
float accumulatedOpacity) const;
void paintSide(GraphicsContext*, const ComplexBorderInfo&, BoxSide, unsigned alpha, BorderEdgeFlags) const;
void paintOneBorderSide(GraphicsContext*, const FloatRect& sideRect, BoxSide, BoxSide adjacentSide1,
BoxSide adjacentSide2, const Path*, bool antialias, Color, BorderEdgeFlags) const;
bool paintBorderFastPath(GraphicsContext*, const LayoutRect& borderRect) const;
void drawDoubleBorder(GraphicsContext*, const LayoutRect& borderRect) const;
void drawBoxSideFromPath(GraphicsContext*, const LayoutRect&, const Path&, float thickness,
float drawThickness, BoxSide, Color, EBorderStyle) const;
void clipBorderSidePolygon(GraphicsContext*, BoxSide, MiterType miter1, MiterType miter2) const;
void clipBorderSideForComplexInnerPath(GraphicsContext*, BoxSide) const;
MiterType computeMiter(BoxSide, BoxSide adjacentSide, BorderEdgeFlags, bool antialias) const;
static bool mitersRequireClipping(MiterType miter1, MiterType miter2, EBorderStyle, bool antialias);
const BorderEdge& firstEdge() const
{
ASSERT(m_visibleEdgeSet);
return m_edges[m_firstVisibleEdge];
}
// const inputs
const ComputedStyle& m_style;
const BackgroundBleedAvoidance m_bleedAvoidance;
const bool m_includeLogicalLeftEdge;
const bool m_includeLogicalRightEdge;
// computed attributes
FloatRoundedRect m_outer;
FloatRoundedRect m_inner;
BorderEdge m_edges[4];
unsigned m_visibleEdgeCount;
unsigned m_firstVisibleEdge;
BorderEdgeFlags m_visibleEdgeSet;
bool m_isUniformStyle;
bool m_isUniformWidth;
bool m_isUniformColor;
bool m_isRounded;
bool m_hasAlpha;
};
} // namespace blink
#endif