/*
* Copyright 2013 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkBorder_DEFINED
#define SkBorder_DEFINED
#include "SkColor.h"
#include "SkPaint.h"
#include "SkScalar.h"
#include "SkTArray.h"
// This class provides a concise means of specifying all the geometry/shading
// associated with a CSS-style box/round-rect.
class SkBorder {
public:
enum BorderStyle {
/**
*/
kNone_BorderStyle,
/**
*/
kHidden_BorderStyle,
/**
*/
kDotted_BorderStyle,
/**
*/
kDashed_BorderStyle,
/**
*/
kSolid_BorderStyle,
/**
*/
kDouble_BorderStyle,
/**
*/
kGroove_BorderStyle,
/**
*/
kRidge_BorderStyle,
/**
*/
kInset_BorderStyle,
/**
*/
kOutset_BorderStyle,
};
enum BlurStyle {
kNormal_BlurStyle, //!< fuzzy inside and outside
kInner_BlurStyle, //!< fuzzy inside, nothing outside
};
struct ShadowInfo {
SkScalar fXOffset;
SkScalar fYOffset;
SkScalar fBlurSigma;
SkColor fColor;
BlurStyle fStyle;
};
SkBorder(SkPaint& p, SkScalar width, BorderStyle style);
SkBorder(const SkPaint paints[4], const SkScalar widths[4], const BorderStyle styles[4]);
void setBackground(SkPaint* p) {
if (NULL == p) {
fBackground.reset();
fFlags &= ~kDrawBackground_Flag;
} else {
fBackground = *p;
fFlags |= kDrawBackground_Flag;
}
}
void addShadow(ShadowInfo& info) {
fShadows.push_back(info);
}
private:
enum Flags {
// One paint "fPaints[0]" is applied to all the borders
kOnePaint_Flag = 0x01,
// Use 'fBackground' to draw the background
kDrawBackground_Flag = 0x02,
};
// If kOnePaint_Flag is specified then fBorder[0] is applied to all sides.
// Otherwise the order is: left, top, right, bottom
SkPaint fPaints[4];
// Only valid if kDrawBackground_Flag is set.
SkPaint fBackground;
SkScalar fWidths[4];
BorderStyle fStyles[4];
SkTArray<ShadowInfo> fShadows;
uint32_t fFlags;
};
#endif