blob: 70c4d0f2c11f80f665da7b0cd052132b41e0e0d3 [file] [log] [blame]
// Copyright 2015 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "topaz/examples/ui/noodles/noodles_view.h"
#include <math.h>
#include <cstdlib>
#include <utility>
#include "src/lib/fxl/logging.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkPath.h"
namespace examples {
namespace {
constexpr float kSecondsBetweenChanges = 10.f;
constexpr float kSpeed = 1.f;
constexpr float kSecondsPerNanosecond = .000'000'001f;
void Lissajous(SkPath* path, double ax, double ay, int wx, int wy, double p) {
uint32_t segments = ceil(fabs(ax) + fabs(ay)) / 2u + 1u;
for (uint32_t i = 0; i < segments; ++i) {
double t = M_PI * 2.0 * i / segments;
double x = ax * sin(t * wx);
double y = ay * sin(t * wy + p);
if (i == 0u)
path->moveTo(x, y);
else
path->lineTo(x, y);
}
path->close();
}
} // namespace
NoodlesView::NoodlesView(scenic::ViewContextTransitional view_context)
: SkiaView(std::move(view_context), "Noodles") {}
void NoodlesView::OnSceneInvalidated(
fuchsia::images::PresentationInfo presentation_info) {
SkCanvas* canvas = AcquireCanvas();
if (!canvas)
return;
// Update the animation state.
uint64_t presentation_time = presentation_info.presentation_time;
if (!start_time_ ||
presentation_time - start_time_ >= ZX_SEC(kSecondsBetweenChanges)) {
start_time_ = presentation_time;
wx_ = rand() % 9 + 1;
wy_ = rand() % 9 + 1;
}
const float phase =
(presentation_time - start_time_) * kSecondsPerNanosecond * kSpeed;
Draw(canvas, phase);
ReleaseAndSwapCanvas();
// Animate.
InvalidateScene();
}
void NoodlesView::Draw(SkCanvas* canvas, float phase) {
constexpr int count = 4;
constexpr int padding = 1;
canvas->clear(SK_ColorBLACK);
double cx = logical_size().x * 0.5;
double cy = logical_size().y * 0.5;
canvas->translate(cx, cy);
for (int i = 0; i < count; i++, phase += 0.1) {
SkPaint paint;
SkScalar hsv[3] = {static_cast<SkScalar>(fmod(phase * 120, 360)), 1, 1};
paint.setColor(SkHSVToColor(hsv));
paint.setStyle(SkPaint::kStroke_Style);
paint.setAntiAlias(true);
SkPath path;
Lissajous(&path, cx - padding, cy - padding, wx_, wy_, phase);
canvas->drawPath(path, paint);
}
}
} // namespace examples