Merge pull request #1535 from abarth/button_highlight

FlatButton highlights but doesn't tap around edge
diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart
index 4baf5c1..5bf22b3 100644
--- a/packages/flutter/lib/src/rendering/box.dart
+++ b/packages/flutter/lib/src/rendering/box.dart
@@ -250,7 +250,7 @@
     return value;
   }
 
-  String toString() => "BoxConstraints($minWidth<=w<$maxWidth, $minHeight<=h<$maxHeight)";
+  String toString() => "BoxConstraints($minWidth<=w<=$maxWidth, $minHeight<=h<=$maxHeight)";
 }
 
 /// A hit test entry used by [RenderBox]
diff --git a/packages/flutter_sprites/lib/physics_body.dart b/packages/flutter_sprites/lib/physics_body.dart
index 0d12feb..178b1ac 100644
--- a/packages/flutter_sprites/lib/physics_body.dart
+++ b/packages/flutter_sprites/lib/physics_body.dart
@@ -16,7 +16,7 @@
     Offset linearVelocity: Offset.zero,
     double angularVelocity: 0.0,
     this.linearDampening: 0.0,
-    double awakeangularDampening: 0.0,
+    double angularDampening: 0.0,
     bool allowSleep: true,
     bool awake: true,
     bool fixedRotation: false,
@@ -232,6 +232,58 @@
 
   bool _attached = false;
 
+  void applyForce(Offset force, Point worldPoint) {
+    assert(_body != null);
+
+    Vector2 b2Force = new Vector2(
+      force.dx / _physicsNode.b2WorldToNodeConversionFactor,
+      force.dy / _physicsNode.b2WorldToNodeConversionFactor);
+
+    Vector2 b2Point = new Vector2(
+      worldPoint.x / _physicsNode.b2WorldToNodeConversionFactor,
+      worldPoint.y / _physicsNode.b2WorldToNodeConversionFactor
+    );
+
+    _body.applyForce(b2Force, b2Point);
+  }
+
+  void applyForceToCenter(Offset force) {
+    assert(_body != null);
+
+    Vector2 b2Force = new Vector2(
+      force.dx / _physicsNode.b2WorldToNodeConversionFactor,
+      force.dy / _physicsNode.b2WorldToNodeConversionFactor);
+
+    _body.applyForceToCenter(b2Force);
+  }
+
+  void applyTorque(double torque) {
+    assert(_body != null);
+
+    _body.applyTorque(torque / _physicsNode.b2WorldToNodeConversionFactor);
+  }
+
+  void applyLinearImpulse(Offset impulse, Point worldPoint, [bool wake = true]) {
+    assert(_body != null);
+
+    Vector2 b2Impulse = new Vector2(
+      impulse.dx / _physicsNode.b2WorldToNodeConversionFactor,
+      impulse.dy / _physicsNode.b2WorldToNodeConversionFactor);
+
+    Vector2 b2Point = new Vector2(
+      worldPoint.x / _physicsNode.b2WorldToNodeConversionFactor,
+      worldPoint.y / _physicsNode.b2WorldToNodeConversionFactor
+    );
+
+    _body.applyLinearImpulse(b2Impulse, b2Point, wake);
+  }
+
+  void applyAngularImpulse(double impulse) {
+    assert(_body != null);
+
+    _body.applyAngularImpulse(impulse / _physicsNode.b2WorldToNodeConversionFactor);
+  }
+
   void _attach(PhysicsNode physicsNode, Node node) {
     assert(_attached == false);