Add WTF::move()
[WebKit-https.git] / Source / WebCore / rendering / style / NinePieceImage.h
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2003, 2005, 2006, 2007, 2008, 2013 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #ifndef NinePieceImage_h
25 #define NinePieceImage_h
26
27 #include "DataRef.h"
28 #include "LayoutUnit.h"
29 #include "LengthBox.h"
30 #include "StyleImage.h"
31
32 namespace WebCore {
33
34 enum ENinePieceImageRule {
35     StretchImageRule, RoundImageRule, SpaceImageRule, RepeatImageRule
36 };
37
38 class NinePieceImageData : public RefCounted<NinePieceImageData> {
39 public:
40     static PassRef<NinePieceImageData> create() { return adoptRef(*new NinePieceImageData); }
41     PassRef<NinePieceImageData> copy() const;
42
43     bool operator==(const NinePieceImageData&) const;
44     bool operator!=(const NinePieceImageData& o) const { return !(*this == o); }
45
46     bool fill : 1;
47     unsigned horizontalRule : 2; // ENinePieceImageRule
48     unsigned verticalRule : 2; // ENinePieceImageRule
49     RefPtr<StyleImage> image;
50     LengthBox imageSlices;
51     LengthBox borderSlices;
52     LengthBox outset;
53
54 private:
55     NinePieceImageData();
56     NinePieceImageData(const NinePieceImageData&);
57 };
58
59 class NinePieceImage {
60 public:
61     NinePieceImage();
62     NinePieceImage(PassRefPtr<StyleImage>, LengthBox imageSlices, bool fill, LengthBox borderSlices, LengthBox outset, ENinePieceImageRule horizontalRule, ENinePieceImageRule verticalRule);
63
64     bool operator==(const NinePieceImage& other) const { return m_data == other.m_data; }
65     bool operator!=(const NinePieceImage& other) const { return m_data != other.m_data; }
66
67     bool hasImage() const { return m_data->image; }
68     StyleImage* image() const { return m_data->image.get(); }
69     void setImage(PassRefPtr<StyleImage> image) { m_data.access()->image = image; }
70     
71     const LengthBox& imageSlices() const { return m_data->imageSlices; }
72     void setImageSlices(LengthBox slices) { m_data.access()->imageSlices = WTF::move(slices); }
73
74     bool fill() const { return m_data->fill; }
75     void setFill(bool fill) { m_data.access()->fill = fill; }
76
77     const LengthBox& borderSlices() const { return m_data->borderSlices; }
78     void setBorderSlices(LengthBox slices) { m_data.access()->borderSlices = WTF::move(slices); }
79
80     const LengthBox& outset() const { return m_data->outset; }
81     void setOutset(LengthBox outset) { m_data.access()->outset = WTF::move(outset); }
82
83     ENinePieceImageRule horizontalRule() const { return static_cast<ENinePieceImageRule>(m_data->horizontalRule); }
84     void setHorizontalRule(ENinePieceImageRule rule) { m_data.access()->horizontalRule = rule; }
85     
86     ENinePieceImageRule verticalRule() const { return static_cast<ENinePieceImageRule>(m_data->verticalRule); }
87     void setVerticalRule(ENinePieceImageRule rule) { m_data.access()->verticalRule = rule; }
88
89     void copyImageSlicesFrom(const NinePieceImage& other)
90     {
91         m_data.access()->imageSlices = other.m_data->imageSlices;
92         m_data.access()->fill = other.m_data->fill;
93     }
94
95     void copyBorderSlicesFrom(const NinePieceImage& other)
96     {
97         m_data.access()->borderSlices = other.m_data->borderSlices;
98     }
99     
100     void copyOutsetFrom(const NinePieceImage& other)
101     {
102         m_data.access()->outset = other.m_data->outset;
103     }
104
105     void copyRepeatFrom(const NinePieceImage& other)
106     {
107         m_data.access()->horizontalRule = other.m_data->horizontalRule;
108         m_data.access()->verticalRule = other.m_data->verticalRule;
109     }
110
111     void setMaskDefaults()
112     {
113         m_data.access()->imageSlices = LengthBox(0);
114         m_data.access()->fill = true;
115         m_data.access()->borderSlices = LengthBox();
116     }
117
118     static LayoutUnit computeOutset(const Length& outsetSide, LayoutUnit borderSide)
119     {
120         if (outsetSide.isRelative())
121             return outsetSide.value() * borderSide;
122         return outsetSide.value();
123     }
124
125 private:
126     DataRef<NinePieceImageData> m_data;
127 };
128
129 } // namespace WebCore
130
131 #endif // NinePieceImage_h