|  | // 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. | 
|  |  | 
|  | import 'dart:ui' as ui; | 
|  | import 'dart:math' as math; | 
|  | import 'dart:typed_data'; | 
|  |  | 
|  | ui.Picture paint(ui.Rect paintBounds) { | 
|  | ui.PictureRecorder recorder = new ui.PictureRecorder(); | 
|  | ui.Canvas canvas = new ui.Canvas(recorder, paintBounds); | 
|  | ui.Size size = paintBounds.size; | 
|  |  | 
|  | ui.Paint paint = new ui.Paint(); | 
|  | ui.Point mid = size.center(ui.Point.origin); | 
|  | double radius = size.shortestSide / 2.0; | 
|  | canvas.drawPaint(new ui.Paint()..color = const ui.Color(0xFFFFFFFF)); | 
|  |  | 
|  | canvas.save(); | 
|  | canvas.translate(-mid.x/2.0, ui.window.size.height*2.0); | 
|  | canvas.clipRect( | 
|  | new ui.Rect.fromLTRB(0.0, -ui.window.size.height, ui.window.size.width, radius)); | 
|  |  | 
|  | canvas.translate(mid.x, mid.y); | 
|  | paint.color = const ui.Color.fromARGB(128, 255, 0, 255); | 
|  | canvas.rotate(math.PI/4.0); | 
|  |  | 
|  | ui.Gradient yellowBlue = new ui.Gradient.linear( | 
|  | <ui.Point>[new ui.Point(-radius, -radius), new ui.Point(0.0, 0.0)], | 
|  | <ui.Color>[const ui.Color(0xFFFFFF00), const ui.Color(0xFF0000FF)] | 
|  | ); | 
|  | canvas.drawRect(new ui.Rect.fromLTRB(-radius, -radius, radius, radius), | 
|  | new ui.Paint()..shader = yellowBlue); | 
|  |  | 
|  | // Scale x and y by 0.5. | 
|  | Float64List scaleMatrix = new Float64List.fromList(<double>[ | 
|  | 0.5, 0.0, 0.0, 0.0, | 
|  | 0.0, 0.5, 0.0, 0.0, | 
|  | 0.0, 0.0, 1.0, 0.0, | 
|  | 0.0, 0.0, 0.0, 1.0, | 
|  | ]); | 
|  | canvas.transform(scaleMatrix); | 
|  | paint.color = const ui.Color.fromARGB(128, 0, 255, 0); | 
|  | canvas.drawCircle(ui.Point.origin, radius, paint); | 
|  |  | 
|  | canvas.restore(); | 
|  |  | 
|  | canvas.translate(0.0, 50.0); | 
|  | ui.LayerDrawLooperBuilder builder = new ui.LayerDrawLooperBuilder() | 
|  | ..addLayerOnTop( | 
|  | new ui.DrawLooperLayerInfo() | 
|  | ..setOffset(const ui.Offset(150.0, 0.0)) | 
|  | ..setColorMode(ui.TransferMode.src) | 
|  | ..setPaintBits(ui.PaintBits.all), | 
|  | new ui.Paint() | 
|  | ..color = const ui.Color.fromARGB(128, 255, 255, 0) | 
|  | ..colorFilter = new ui.ColorFilter.mode( | 
|  | const ui.Color.fromARGB(128, 0, 0, 255), | 
|  | ui.TransferMode.srcIn | 
|  | ) | 
|  | ..maskFilter = new ui.MaskFilter.blur( | 
|  | ui.BlurStyle.normal, 3.0, highQuality: true | 
|  | ) | 
|  | ) | 
|  | ..addLayerOnTop( | 
|  | new ui.DrawLooperLayerInfo() | 
|  | ..setOffset(const ui.Offset(75.0, 75.0)) | 
|  | ..setColorMode(ui.TransferMode.src) | 
|  | ..setPaintBits(ui.PaintBits.shader), | 
|  | new ui.Paint() | 
|  | ..shader = new ui.Gradient.radial( | 
|  | new ui.Point(0.0, 0.0), radius/3.0, | 
|  | <ui.Color>[ | 
|  | const ui.Color(0xFFFFFF00), | 
|  | const ui.Color(0xFFFF0000) | 
|  | ], | 
|  | null, | 
|  | ui.TileMode.mirror | 
|  | ) | 
|  | // Since we're don't set ui.PaintBits.maskFilter, this has no effect. | 
|  | ..maskFilter = new ui.MaskFilter.blur( | 
|  | ui.BlurStyle.normal, 50.0, highQuality: true | 
|  | ) | 
|  | ) | 
|  | ..addLayerOnTop( | 
|  | new ui.DrawLooperLayerInfo()..setOffset(const ui.Offset(225.0, 75.0)), | 
|  | // Since this layer uses a DST color mode, this has no effect. | 
|  | new ui.Paint()..color = const ui.Color.fromARGB(128, 255, 0, 0) | 
|  | ); | 
|  | paint.drawLooper = builder.build(); | 
|  | canvas.drawCircle(ui.Point.origin, radius, paint); | 
|  |  | 
|  | return recorder.endRecording(); | 
|  | } | 
|  |  | 
|  | ui.Scene composite(ui.Picture picture, ui.Rect paintBounds) { | 
|  | final double devicePixelRatio = ui.window.devicePixelRatio; | 
|  | ui.Rect sceneBounds = new ui.Rect.fromLTWH(0.0, 0.0, ui.window.size.width * devicePixelRatio, ui.window.size.height * devicePixelRatio); | 
|  | Float64List deviceTransform = new Float64List(16) | 
|  | ..[0] = devicePixelRatio | 
|  | ..[5] = devicePixelRatio | 
|  | ..[10] = 1.0 | 
|  | ..[15] = 1.0; | 
|  | ui.SceneBuilder sceneBuilder = new ui.SceneBuilder(sceneBounds) | 
|  | ..pushTransform(deviceTransform) | 
|  | ..addPicture(ui.Offset.zero, picture) | 
|  | ..pop(); | 
|  | return sceneBuilder.build(); | 
|  | } | 
|  |  | 
|  | void beginFrame(Duration timeStamp) { | 
|  | ui.Rect paintBounds = ui.Point.origin & ui.window.size; | 
|  | ui.Picture picture = paint(paintBounds); | 
|  | ui.Scene scene = composite(picture, paintBounds); | 
|  | ui.window.render(scene); | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | ui.window.onBeginFrame = beginFrame; | 
|  | ui.window.scheduleFrame(); | 
|  | } |