• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012, The Android Open Source Project
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *  * Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef FixedPositioning_h
27 #define FixedPositioning_h
28 
29 #if USE(ACCELERATED_COMPOSITING)
30 
31 #include "LayerAndroid.h"
32 #include "Length.h"
33 
34 namespace WebCore {
35 
36 class IFrameLayerAndroid;
37 
38 struct SkLength {
39     enum SkLengthType { Undefined, Auto, Relative,
40         Percent, Fixed, Static, Intrinsic, MinIntrinsic };
41     SkLengthType type;
42     SkScalar value;
SkLengthSkLength43     SkLength()
44     {
45         type = Undefined;
46         value = 0;
47     }
definedSkLength48     bool defined() const
49     {
50         if (type == Undefined)
51             return false;
52         return true;
53     }
setFixedValueSkLength54     void setFixedValue(float v)
55     {
56         type = Fixed;
57         value = v;
58     }
setAutoSkLength59     void setAuto()
60     {
61         type = Auto;
62     }
calcFloatValueSkLength63     float calcFloatValue(float max) const
64     {
65         switch (type) {
66         case Percent:
67             return (max * value) / 100.0f;
68         case Fixed:
69             return value;
70         default:
71             return value;
72         }
73     }
74 
convertLengthSkLength75     static SkLength convertLength(Length len)
76     {
77         SkLength length;
78         length.type = SkLength::Undefined;
79         length.value = 0;
80         if (len.type() == WebCore::Percent) {
81             length.type = SkLength::Percent;
82             length.value = len.percent();
83         }
84         if (len.type() == WebCore::Fixed) {
85             length.type = SkLength::Fixed;
86             length.value = len.value();
87         }
88         return length;
89     }
90 
91 };
92 
93 class FixedPositioning {
94 
95 public:
m_layer(layer)96     FixedPositioning(LayerAndroid* layer = 0) : m_layer(layer) {}
97     FixedPositioning(LayerAndroid* layer, const FixedPositioning& position);
~FixedPositioning()98     virtual ~FixedPositioning() {};
99 
isBackgroundImagePositioning()100     virtual bool isBackgroundImagePositioning() { return true; }
copy(LayerAndroid * layer)101     virtual FixedPositioning* copy(LayerAndroid* layer) const {
102         return new FixedPositioning(layer, *this);
103     }
104 
setFixedPosition(SkLength left,SkLength top,SkLength right,SkLength bottom,SkLength marginLeft,SkLength marginTop,SkLength marginRight,SkLength marginBottom,const IntPoint & renderLayerPos,SkRect viewRect)105     void setFixedPosition(SkLength left, // CSS left property
106                           SkLength top, // CSS top property
107                           SkLength right, // CSS right property
108                           SkLength bottom, // CSS bottom property
109                           SkLength marginLeft, // CSS margin-left property
110                           SkLength marginTop, // CSS margin-top property
111                           SkLength marginRight, // CSS margin-right property
112                           SkLength marginBottom, // CSS margin-bottom property
113                           const IntPoint& renderLayerPos, // For undefined fixed position
114                           SkRect viewRect) { // view rect, can be smaller than the layer's
115         m_fixedLeft = left;
116         m_fixedTop = top;
117         m_fixedRight = right;
118         m_fixedBottom = bottom;
119         m_fixedMarginLeft = marginLeft;
120         m_fixedMarginTop = marginTop;
121         m_fixedMarginRight = marginRight;
122         m_fixedMarginBottom = marginBottom;
123         m_fixedRect = viewRect;
124         m_renderLayerPos = renderLayerPos;
125     }
126 
127     SkRect getViewport(SkRect viewport, IFrameLayerAndroid* parentIframeLayer);
128     virtual IFrameLayerAndroid* updatePosition(SkRect viewPort,
129                                                IFrameLayerAndroid* parentIframeLayer);
130 
131     void contentDraw(SkCanvas* canvas, Layer::PaintStyle style);
132 
133     void dumpLayer(LayerDumper*) const;
134 
135     // ViewStateSerializer friends
136     friend void android::serializeLayer(LayerAndroid* layer, SkWStream* stream);
137     friend LayerAndroid* android::deserializeLayer(int version, SkStream* stream);
138 
139 protected:
140     LayerAndroid* m_layer;
141 
142     SkLength m_fixedLeft;
143     SkLength m_fixedTop;
144     SkLength m_fixedRight;
145     SkLength m_fixedBottom;
146     SkLength m_fixedMarginLeft;
147     SkLength m_fixedMarginTop;
148     SkLength m_fixedMarginRight;
149     SkLength m_fixedMarginBottom;
150     SkRect m_fixedRect;
151 
152     // When fixed element is undefined or auto, the render layer's position
153     // is needed for offset computation
154     IntPoint m_renderLayerPos;
155 };
156 
157 class BackgroundImagePositioning : public FixedPositioning {
158 public:
BackgroundImagePositioning(LayerAndroid * layer)159     BackgroundImagePositioning(LayerAndroid* layer)
160         : FixedPositioning(layer)
161         , m_repeatX(false)
162         , m_repeatY(false)
163         , m_nbRepeatX(0)
164         , m_nbRepeatY(0)
165         , m_offsetX(0)
166         , m_offsetY(0)
167     {}
168     BackgroundImagePositioning(LayerAndroid* layer, const BackgroundImagePositioning& position);
isBackgroundImagePositioning()169     virtual bool isBackgroundImagePositioning() { return true; }
copy(LayerAndroid * layer)170     virtual FixedPositioning* copy(LayerAndroid* layer) const {
171         return new BackgroundImagePositioning(layer, *this);
172     }
setPosition(SkLength left,SkLength top)173     void setPosition(SkLength left, SkLength top) {
174         m_fixedLeft = left;
175         m_fixedTop = top;
176     }
177     virtual IFrameLayerAndroid* updatePosition(SkRect viewPort,
178                                                IFrameLayerAndroid* parentIframeLayer);
179 
180     // Measures the background image repetition
setRepeatX(bool repeat)181     void setRepeatX(bool repeat) { m_repeatX = repeat; }
setRepeatY(bool repeat)182     void setRepeatY(bool repeat) { m_repeatY = repeat; }
repeatX()183     bool repeatX() { return m_repeatX; }
repeatY()184     bool repeatY() { return m_repeatY; }
nbRepeatX()185     int nbRepeatX() { return m_nbRepeatX; }
offsetX()186     int offsetX() { return m_offsetX; }
nbRepeatY()187     int nbRepeatY() { return m_nbRepeatY; }
offsetY()188     int offsetY() { return m_offsetY; }
189 
190 private:
191     bool m_repeatX;
192     bool m_repeatY;
193     int  m_nbRepeatX;
194     int  m_nbRepeatY;
195     int  m_offsetX;
196     int  m_offsetY;
197 };
198 
199 }
200 
201 #endif // USE(ACCELERATED_COMPOSITING)
202 
203 #endif // FixedPositioning_h
204