add SkLayer (from webkit)
diff --git a/Android.mk b/Android.mk
index 0e6dbbb..f76aee3 100644
--- a/Android.mk
+++ b/Android.mk
@@ -165,6 +165,7 @@
 	src/utils/SkCamera.cpp \
 	src/utils/SkDumpCanvas.cpp \
 	src/utils/SkInterpolator.cpp \
+	src/utils/SkLayer.cpp \
 	src/utils/SkMeshUtils.cpp \
 	src/utils/SkNinePatch.cpp \
 	src/utils/SkProxyCanvas.cpp
diff --git a/include/utils/SkLayer.h b/include/utils/SkLayer.h
new file mode 100644
index 0000000..c277dda
--- /dev/null
+++ b/include/utils/SkLayer.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SkLayer_DEFINED
+#define SkLayer_DEFINED
+
+#include "SkRefCnt.h"
+#include "SkTDArray.h"
+#include "SkColor.h"
+#include "SkPoint.h"
+#include "SkRect.h"
+#include "SkSize.h"
+
+class SkCanvas;
+class SkPicture;
+
+
+struct SkLength {
+  enum SkLengthType { Undefined, Auto, Relative, Percent, Fixed, Static, Intrinsic, MinIntrinsic };
+  SkLengthType type;
+  SkScalar value;
+  SkLength() {
+    type = Undefined;
+    value = 0;
+  }
+  bool defined() const {
+    if (type == Undefined)
+      return false;
+    return true;
+  }
+  float calcFloatValue(float max) const {
+    switch (type) {
+      case Percent:
+        return (max * value) / 100.0f;
+      case Fixed:
+        return value;
+      default:
+        return value;
+    }
+  }
+};
+
+class SkLayer : public SkRefCnt {
+
+public:
+    SkLayer();
+    SkLayer(const SkLayer&);
+    virtual ~SkLayer();
+
+    // setters
+
+    void setSize(SkScalar w, SkScalar h) { m_size.set(w, h); }
+    void setOpacity(SkScalar opacity) { m_opacity = opacity; }
+    void setTranslation(SkScalar x, SkScalar y) { m_translation.set(x, y); }
+    void setRotation(SkScalar a) { m_angleTransform = a; m_doRotation = true; }
+    void setScale(SkScalar x, SkScalar y) { m_scale.set(x, y); }
+    void setPosition(SkScalar x, SkScalar y) { m_position.set(x, y); }
+    void setAnchorPoint(SkScalar x, SkScalar y) { m_anchorPoint.set(x, y); }
+    virtual void setBackgroundColor(SkColor color) { m_backgroundColor = color; m_backgroundColorSet = true; }
+    void setFixedPosition(SkLength left, SkLength top, SkLength right, SkLength bottom) {
+      m_fixedLeft = left;
+      m_fixedTop = top;
+      m_fixedRight = right;
+      m_fixedBottom = bottom;
+      m_isFixed = true;
+    }
+
+    // getters
+
+    SkPoint position() const { return m_position; }
+    SkPoint translation() const { return m_translation; }
+    SkSize  size() const { return m_size; }
+    SkRect  bounds() const {
+      SkRect rect;
+      rect.set(m_position.fX, m_position.fY,
+               m_position.fX + m_size.width(),
+               m_position.fY + m_size.height());
+      rect.offset(m_translation.fX, m_translation.fY);
+      return rect;
+    }
+
+    // children
+
+    int countChildren() const;
+    SkLayer* getChild(int index) const;
+    SkLayer* addChild(SkLayer* child);
+    void removeChildren();
+
+    // paint method
+
+    virtual void paintOn(SkPoint offset, SkSize size, SkScalar scale, SkCanvas*) = 0;
+
+public:
+
+    bool m_doRotation;
+    bool m_isFixed;
+    bool m_backgroundColorSet;
+
+    // layers properties
+
+    SkScalar m_angleTransform;
+    SkScalar m_opacity;
+
+    SkSize m_size;
+    SkPoint m_position;
+    SkPoint m_translation;
+    SkPoint m_anchorPoint;
+    SkPoint m_scale;
+
+    SkLength m_fixedLeft;
+    SkLength m_fixedTop;
+    SkLength m_fixedRight;
+    SkLength m_fixedBottom;
+
+    SkColor m_backgroundColor;
+
+    SkTDArray<SkLayer*> m_children;
+};
+
+#endif
diff --git a/src/utils/SkLayer.cpp b/src/utils/SkLayer.cpp
new file mode 100644
index 0000000..c5a6d9a
--- /dev/null
+++ b/src/utils/SkLayer.cpp
@@ -0,0 +1,67 @@
+#include "SkLayer.h"
+
+SkLayer::SkLayer() {
+    m_doRotation = false;
+    m_isFixed = false;
+    m_backgroundColorSet = false;
+
+    m_angleTransform = 0;
+    m_opacity = 1;
+
+    m_size.set(0, 0);
+    m_position.set(0, 0);
+    m_translation.set(0, 0);
+    m_anchorPoint.set(0.5, 0.5);
+    m_scale.set(1, 1);
+
+    m_backgroundColor = 0;
+}
+
+SkLayer::SkLayer(const SkLayer& src) {
+    m_doRotation = src.m_doRotation;
+    m_isFixed = src.m_isFixed;
+    m_backgroundColorSet = src.m_backgroundColorSet;
+
+    m_angleTransform = src.m_angleTransform;
+    m_opacity = src.m_opacity;
+    m_size = src.m_size;
+    m_position = src.m_position;
+    m_translation = src.m_translation;
+    m_anchorPoint = src.m_anchorPoint;
+    m_scale = src.m_scale;
+
+    m_fixedLeft = src.m_fixedLeft;
+    m_fixedTop = src.m_fixedTop;
+    m_fixedRight = src.m_fixedRight;
+    m_fixedBottom = src.m_fixedBottom;
+
+    m_backgroundColor = src.m_backgroundColor;
+}
+
+SkLayer::~SkLayer() {
+    this->removeChildren();
+}
+
+int SkLayer::countChildren() const {
+    return m_children.count();
+}
+
+SkLayer* SkLayer::getChild(int index) const {
+    if ((unsigned)index < (unsigned)m_children.count()) {
+        return m_children[index];
+    }
+    return NULL;
+}
+
+SkLayer* SkLayer::addChild(SkLayer* child) {
+    child->ref();
+    *m_children.append() = child;
+    return child;
+}
+
+void SkLayer::removeChildren() {
+    m_children.unrefAll();
+    m_children.reset();
+}
+
+