#ifndef NinePieceImage_h
#define NinePieceImage_h
#include "core/rendering/style/BorderImageLengthBox.h"
#include "core/rendering/style/DataRef.h"
#include "core/rendering/style/StyleImage.h"
#include "platform/LayoutUnit.h"
#include "platform/LengthBox.h"
namespace WebCore {
enum ENinePieceImageRule {
StretchImageRule, RoundImageRule, SpaceImageRule, RepeatImageRule
};
class NinePieceImageData : public RefCounted<NinePieceImageData> {
public:
static PassRefPtr<NinePieceImageData> create() { return adoptRef(new NinePieceImageData); }
PassRefPtr<NinePieceImageData> copy() const { return adoptRef(new NinePieceImageData(*this)); }
bool operator==(const NinePieceImageData&) const;
bool operator!=(const NinePieceImageData& o) const { return !(*this == o); }
bool fill : 1;
unsigned horizontalRule : 2;
unsigned verticalRule : 2;
RefPtr<StyleImage> image;
LengthBox imageSlices;
BorderImageLengthBox borderSlices;
BorderImageLengthBox outset;
private:
NinePieceImageData();
NinePieceImageData(const NinePieceImageData&);
};
class NinePieceImage {
public:
NinePieceImage();
NinePieceImage(PassRefPtr<StyleImage>, LengthBox imageSlices, bool fill, const BorderImageLengthBox& borderSlices,
const BorderImageLengthBox& outset, ENinePieceImageRule horizontalRule, ENinePieceImageRule verticalRule);
bool operator==(const NinePieceImage& other) const { return m_data == other.m_data; }
bool operator!=(const NinePieceImage& other) const { return m_data != other.m_data; }
bool hasImage() const { return m_data->image; }
StyleImage* image() const { return m_data->image.get(); }
void setImage(PassRefPtr<StyleImage> image) { m_data.access()->image = image; }
const LengthBox& imageSlices() const { return m_data->imageSlices; }
void setImageSlices(const LengthBox& slices) { m_data.access()->imageSlices = slices; }
bool fill() const { return m_data->fill; }
void setFill(bool fill) { m_data.access()->fill = fill; }
const BorderImageLengthBox& borderSlices() const { return m_data->borderSlices; }
void setBorderSlices(const BorderImageLengthBox& slices) { m_data.access()->borderSlices = slices; }
const BorderImageLengthBox& outset() const { return m_data->outset; }
void setOutset(const BorderImageLengthBox& outset) { m_data.access()->outset = outset; }
ENinePieceImageRule horizontalRule() const { return static_cast<ENinePieceImageRule>(m_data->horizontalRule); }
void setHorizontalRule(ENinePieceImageRule rule) { m_data.access()->horizontalRule = rule; }
ENinePieceImageRule verticalRule() const { return static_cast<ENinePieceImageRule>(m_data->verticalRule); }
void setVerticalRule(ENinePieceImageRule rule) { m_data.access()->verticalRule = rule; }
void copyImageSlicesFrom(const NinePieceImage& other)
{
m_data.access()->imageSlices = other.m_data->imageSlices;
m_data.access()->fill = other.m_data->fill;
}
void copyBorderSlicesFrom(const NinePieceImage& other)
{
m_data.access()->borderSlices = other.m_data->borderSlices;
}
void copyOutsetFrom(const NinePieceImage& other)
{
m_data.access()->outset = other.m_data->outset;
}
void copyRepeatFrom(const NinePieceImage& other)
{
m_data.access()->horizontalRule = other.m_data->horizontalRule;
m_data.access()->verticalRule = other.m_data->verticalRule;
}
void setMaskDefaults()
{
m_data.access()->imageSlices = LengthBox(0);
m_data.access()->fill = true;
m_data.access()->borderSlices = BorderImageLengthBox(Length(Auto));
}
static LayoutUnit computeOutset(const BorderImageLength& outsetSide, LayoutUnit borderSide)
{
if (outsetSide.isNumber())
return outsetSide.number() * borderSide;
return outsetSide.length().value();
}
private:
DataRef<NinePieceImageData> m_data;
};
}
#endif