Index: examples/dart/camera_roll/lib/main.dart |
diff --git a/examples/dart/camera_roll/lib/main.dart b/examples/dart/camera_roll/lib/main.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..796eb1ecde738ba61582ee9dd9eba313a4861bd3 |
--- /dev/null |
+++ b/examples/dart/camera_roll/lib/main.dart |
@@ -0,0 +1,96 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// This example makes use of mojo:camera_roll which is available only when |
+// running on Android. |
+// |
+// Example usage: |
+// pub get |
+// pub run sky_tools build |
+// pub run sky_tools run_mojo --mojo-path=../../.. --android |
+ |
+import 'dart:sky'; |
+import 'dart:typed_data'; |
+ |
+import 'package:mojo_services/mojo/camera_roll.mojom.dart'; |
+import 'package:sky/services.dart'; |
+ |
+final CameraRollServiceProxy cameraRoll = new CameraRollServiceProxy.unbound(); |
+Image currentImage; |
+int photoIndex = 0; |
+ |
+Picture paint(Rect paintBounds) { |
+ PictureRecorder recorder = new PictureRecorder(); |
+ Canvas canvas = new Canvas(recorder, paintBounds); |
+ Paint paint = new Paint()..color = const Color.fromARGB(255, 0, 255, 0); |
+ if (currentImage != null) { |
+ canvas.drawImage(currentImage, new Point(0.0, 0.0), paint); |
+ } |
+ return recorder.endRecording(); |
+} |
+ |
+Scene composite(Picture picture, Rect paintBounds) { |
+ final double devicePixelRatio = view.devicePixelRatio; |
+ Rect sceneBounds = new Rect.fromLTWH( |
+ 0.0, 0.0, view.width * devicePixelRatio, view.height * devicePixelRatio); |
+ Float32List deviceTransform = new Float32List(16) |
+ ..[0] = devicePixelRatio |
+ ..[5] = devicePixelRatio |
+ ..[10] = 1.0 |
+ ..[15] = 1.0; |
+ SceneBuilder sceneBuilder = new SceneBuilder(sceneBounds) |
+ ..pushTransform(deviceTransform) |
+ ..addPicture(Offset.zero, picture, paintBounds) |
+ ..pop(); |
+ return sceneBuilder.build(); |
+} |
+ |
+void beginFrame(double timeStamp) { |
+ Rect paintBounds = new Rect.fromLTWH(0.0, 0.0, view.width, view.height); |
+ Picture picture = paint(paintBounds); |
+ Scene scene = composite(picture, paintBounds); |
+ view.scene = scene; |
+} |
+ |
+void getPhoto() { |
+ var future = cameraRoll.ptr.getPhoto(photoIndex); |
+ future.then((response) { |
+ if (response.photo == null) { |
+ print("Photo $photoIndex not found, returning to the first photo."); |
+ cameraRoll.ptr.update(); |
+ photoIndex = 0; |
+ getPhoto(); |
+ return; |
+ } |
+ |
+ new ImageDecoder(response.photo.content.handle.h, (image) { |
+ if (image != null) { |
+ currentImage = image; |
+ print("view.scheduleFrame"); |
+ view.scheduleFrame(); |
+ } |
+ }); |
+ }); |
+} |
+ |
+bool handleEvent(Event event) { |
+ if (event.type == 'pointerdown') { |
+ return true; |
+ } |
+ |
+ if (event.type == 'pointerup') { |
+ photoIndex; |
+ getPhoto(); |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+void main() { |
+ embedder.connectToService("mojo:camera", cameraRoll); |
+ view.setFrameCallback(beginFrame); |
+ view.setEventCallback(handleEvent); |
+ getPhoto(); |
+} |