// 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:sky' as sky;
import 'dart:math' as math;
import 'dart:typed_data';

void beginFrame(double timeStamp) {
  sky.PictureRecorder recorder = new sky.PictureRecorder();
  Canvas canvas = new Canvas(recorder, sky.view.width, 200.0);

  sky.Paint paint = new sky.Paint();
  sky.Point mid = new sky.Point(sky.view.width / 2.0, sky.view.height / 2.0);
  double radius = math.min(mid.x, mid.y);

  canvas.drawPaint(new sky.Paint()..color = const sky.Color(0xFFFFFFFF));

  canvas.save();

  canvas.translate(-mid.x/2.0, sky.view.height*2.0);
  canvas.clipRect(
      new sky.Rect.fromLTRB(0.0, -sky.view.height, sky.view.width, radius));

  canvas.translate(mid.x, mid.y);
  paint.color = const sky.Color.fromARGB(128, 255, 0, 255);
  canvas.rotate(math.PI/4.0);

  sky.Gradient yellowBlue = new sky.Gradient.linear(
      [new sky.Point(-radius, -radius), new sky.Point(0.0, 0.0)],
      [const sky.Color(0xFFFFFF00), const sky.Color(0xFF0000FF)]);
  canvas.drawRect(new sky.Rect.fromLTRB(-radius, -radius, radius, radius),
                   new sky.Paint()..setShader(yellowBlue));

  // Scale x and y by 0.5.
  var scaleMatrix = new Float32List.fromList([
      0.5, 0.0, 0.0, 0.0,
      0.0, 0.5, 0.0, 0.0,
      0.0, 0.0, 0.0, 0.0,
      0.0, 0.0, 0.0, 1.0,
  ]);
  canvas.concat(scaleMatrix);
  paint.color = const sky.Color.fromARGB(128, 0, 255, 0);
  canvas.drawCircle(0.0, 0.0, radius, paint);

  canvas.restore();

  canvas.translate(0.0, 50.0);
  var builder = new sky.LayerDrawLooperBuilder()
      ..addLayerOnTop(
          new sky.DrawLooperLayerInfo()
            ..setOffset(const sky.Point(150.0, 0.0))
            ..setColorMode(sky.TransferMode.src)
            ..setPaintBits(sky.PaintBits.all),
          (sky.Paint layerPaint) {
        layerPaint.color = const sky.Color.fromARGB(128, 255, 255, 0);
        layerPaint.setColorFilter(new sky.ColorFilter.mode(
            const sky.Color.fromARGB(128, 0, 0, 255), sky.TransferMode.srcIn));
        layerPaint.setMaskFilter(new sky.MaskFilter.blur(
            sky.BlurStyle.normal, 3.0, highQuality: true));
      })
      ..addLayerOnTop(
          new sky.DrawLooperLayerInfo()
            ..setOffset(const sky.Point(75.0, 75.0))
            ..setColorMode(sky.TransferMode.src)
            ..setPaintBits(sky.PaintBits.shader),
          (sky.Paint layerPaint) {
        sky.Gradient redYellow = new sky.Gradient.radial(
            new sky.Point(0.0, 0.0), radius/3.0,
            [const sky.Color(0xFFFFFF00), const sky.Color(0xFFFF0000)],
            null, sky.TileMode.mirror);
        layerPaint.setShader(redYellow);
        // Since we're don't set sky.PaintBits.maskFilter, this has no effect.
        layerPaint.setMaskFilter(new sky.MaskFilter.blur(
            sky.BlurStyle.normal, 50.0, highQuality: true));
      })
      ..addLayerOnTop(
          new sky.DrawLooperLayerInfo()..setOffset(const sky.Point(225.0, 75.0)),
          (sky.Paint layerPaint) {
        // Since this layer uses a DST color mode, this has no effect.
        layerPaint.color = const sky.Color.fromARGB(128, 255, 0, 0);
      });
  paint.setDrawLooper(builder.build());
  canvas.drawCircle(0.0, 0.0, radius, paint);

  sky.view.picture = recorder.endRecording();
}

void main() {
  sky.view.setBeginFrameCallback(beginFrame);
  sky.view.scheduleFrame();
}
