• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef LayerAndroid_h
18 #define LayerAndroid_h
19 
20 #if USE(ACCELERATED_COMPOSITING)
21 
22 #include "RefPtr.h"
23 #include "SkColor.h"
24 #include "SkLayer.h"
25 #include "StringHash.h"
26 #include <wtf/HashMap.h>
27 
28 class SkCanvas;
29 class SkMatrix;
30 class SkPicture;
31 
32 namespace android {
33 class DrawExtra;
34 }
35 
36 using namespace android;
37 
38 struct SkLength {
39     enum SkLengthType { Undefined, Auto, Relative, Percent, Fixed, Static, Intrinsic, MinIntrinsic };
40     SkLengthType type;
41     SkScalar value;
SkLengthSkLength42     SkLength() {
43         type = Undefined;
44         value = 0;
45     }
definedSkLength46     bool defined() const {
47         if (type == Undefined)
48             return false;
49         return true;
50     }
calcFloatValueSkLength51     float calcFloatValue(float max) const {
52         switch (type) {
53             case Percent:
54                 return (max * value) / 100.0f;
55             case Fixed:
56                 return value;
57             default:
58                 return value;
59         }
60     }
61 };
62 
63 namespace WebCore {
64 
65 class AndroidAnimation;
66 
67 class LayerAndroid : public SkLayer {
68 
69 public:
70     LayerAndroid(bool isRootLayer);
71     LayerAndroid(const LayerAndroid& layer);
72     LayerAndroid(SkPicture* );
73     virtual ~LayerAndroid();
74 
75     static int instancesCount();
76 
setTranslation(SkScalar x,SkScalar y)77     void setTranslation(SkScalar x, SkScalar y) { m_translation.set(x, y); }
setRotation(SkScalar a)78     void setRotation(SkScalar a) { m_angleTransform = a; m_doRotation = true; }
setScale(SkScalar x,SkScalar y)79     void setScale(SkScalar x, SkScalar y) { m_scale.set(x, y); }
translation()80     SkPoint translation() const { return m_translation; }
bounds()81     SkRect  bounds() const {
82         const SkPoint& pos = this->getPosition();
83         const SkSize& size = this->getSize();
84         SkRect rect;
85         rect.set(pos.fX, pos.fY,
86                  pos.fX + size.width(),
87                  pos.fY + size.height());
88         rect.offset(m_translation.fX, m_translation.fY);
89         return rect;
90     }
setFixedPosition(SkLength left,SkLength top,SkLength right,SkLength bottom,SkLength marginLeft,SkLength marginTop,SkLength marginRight,SkLength marginBottom,int offsetX,int offsetY,int width,int height)91     void setFixedPosition(SkLength left,   // CSS left property
92                           SkLength top,    // CSS top property
93                           SkLength right,  // CSS right property
94                           SkLength bottom, // CSS bottom property
95                           SkLength marginLeft,   // CSS margin-left property
96                           SkLength marginTop,    // CSS margin-top property
97                           SkLength marginRight,  // CSS margin-right property
98                           SkLength marginBottom, // CSS margin-bottom property
99                           int offsetX,     // X Offset from the renderer
100                           int offsetY,     // Y Offset from the renderer
101                           int width,       // visible overflow width
102                           int height) {    // visible overflow height
103         m_fixedLeft = left;
104         m_fixedTop = top;
105         m_fixedRight = right;
106         m_fixedBottom = bottom;
107         m_fixedMarginLeft = marginLeft;
108         m_fixedMarginTop = marginTop;
109         m_fixedMarginRight = marginRight;
110         m_fixedMarginBottom = marginBottom;
111         m_fixedOffset.set(offsetX, offsetY);
112         m_fixedWidth = width;
113         m_fixedHeight = height;
114         m_isFixed = true;
115         setInheritFromRootTransform(true);
116     }
117 
118     void setBackgroundColor(SkColor color);
119     void setMaskLayer(LayerAndroid*);
120     void setMasksToBounds(bool);
121 
setIsRootLayer(bool isRootLayer)122     void setIsRootLayer(bool isRootLayer) { m_isRootLayer = isRootLayer; }
123 
124     SkPicture* recordContext();
125 
126     void addAnimation(PassRefPtr<AndroidAnimation> anim);
127     void removeAnimation(const String& name);
128     bool evaluateAnimations() const;
129     bool evaluateAnimations(double time) const;
130     bool hasAnimations() const;
131 
picture()132     SkPicture* picture() const { return m_recordingPicture; }
133 
134     // remove layers bounds from visible rectangle to show what can be
135     // scrolled into view; returns original minus layer bounds in global space.
136     SkRect subtractLayers(const SkRect& visibleRect) const;
137 
138     void dumpLayers(FILE*, int indentLevel) const;
139     void dumpToLog() const;
140 
141     /** Call this with the current viewport (scrolling, zoom) to update
142         the position of the fixed layers.
143 
144         This call is recursive, so it should be called on the root of the
145         hierarchy.
146     */
147     void updateFixedLayersPositions(const SkRect& viewPort);
148 
149     /** Call this to update the position attribute, so that later calls
150         like bounds() will report the corrected position.
151 
152         This call is recursive, so it should be called on the root of the
153         hierarchy.
154      */
155     void updatePositions();
156 
157     void clipArea(SkTDArray<SkRect>* region) const;
158     const LayerAndroid* find(int x, int y) const;
159     const LayerAndroid* findById(int uniqueID) const;
getChild(int index)160     LayerAndroid* getChild(int index) const {
161         return static_cast<LayerAndroid*>(this->INHERITED::getChild(index));
162     }
163     void setExtra(DrawExtra* extra);  // does not assign ownership
uniqueId()164     int uniqueId() const { return m_uniqueId; }
isFixed()165     bool isFixed() { return m_isFixed; }
getOffset()166     const SkPoint& getOffset() const { return m_fixedOffset; }
getFixedWidth()167     int getFixedWidth() { return m_fixedWidth; }
getFixedHeight()168     int getFixedHeight() { return m_fixedHeight; }
169 
170 protected:
171     virtual void onDraw(SkCanvas*, SkScalar opacity);
172 
173 private:
174 #if DUMP_NAV_CACHE
175     friend class CachedLayer::Debug; // debugging access only
176 #endif
177     void bounds(SkRect* ) const;
178     bool prepareContext(bool force = false);
179     void clipInner(SkTDArray<SkRect>* region, const SkRect& local) const;
180 
181     bool m_isRootLayer;
182     bool m_drawsContent;
183     bool m_haveClip;
184     bool m_doRotation;
185     bool m_isFixed;
186     bool m_backgroundColorSet;
187 
188     SkLength m_fixedLeft;
189     SkLength m_fixedTop;
190     SkLength m_fixedRight;
191     SkLength m_fixedBottom;
192     SkLength m_fixedMarginLeft;
193     SkLength m_fixedMarginTop;
194     SkLength m_fixedMarginRight;
195     SkLength m_fixedMarginBottom;
196     SkPoint  m_fixedOffset;
197     int m_fixedWidth;
198     int m_fixedHeight;
199 
200     SkPoint m_translation;
201     SkPoint m_scale;
202     SkScalar m_angleTransform;
203     SkColor m_backgroundColor;
204 
205     SkPicture* m_recordingPicture;
206 
207     typedef HashMap<String, RefPtr<AndroidAnimation> > KeyframesMap;
208     KeyframesMap m_animations;
209     DrawExtra* m_extra;
210     int m_uniqueId;
211 
212     typedef SkLayer INHERITED;
213 };
214 
215 }
216 
217 #else
218 
219 class SkPicture;
220 
221 namespace WebCore {
222 
223 class LayerAndroid {
224 public:
LayerAndroid(SkPicture * picture)225     LayerAndroid(SkPicture* picture) :
226         m_recordingPicture(picture), // does not assign ownership
227         m_uniqueId(-1)
228     {}
picture()229     SkPicture* picture() const { return m_recordingPicture; }
uniqueId()230     int uniqueId() const { return m_uniqueId; }
231 private:
232     SkPicture* m_recordingPicture;
233     int m_uniqueId;
234 };
235 
236 }
237 
238 #endif // USE(ACCELERATED_COMPOSITING)
239 
240 #endif  // LayerAndroid_h
241