blob: 2b67a507c7455ebb61a77bd36a89fbfe071d645d [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/BackgroundBleedAvoidance.h"
#include "core/style/BorderEdge.h"
#include "platform/geometry/FloatRoundedRect.h"
namespace blink {
class ComputedStyle;
class GraphicsContext;
class LayoutRect;
struct PaintInfo;
class Path;
typedef unsigned BorderEdgeFlags;
class BoxBorderPainter {
STACK_ALLOCATED();
public:
BoxBorderPainter(const LayoutRect& borderRect,
const ComputedStyle&,
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