Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 * Copyright (c) 2022, the SerenityOS developers.
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8#include "SampleWidget.h"
9#include <LibGUI/Painter.h>
10
11SampleWidget::SampleWidget()
12{
13 MUST(set_render_sample_count(512));
14}
15
16void SampleWidget::render(GUI::PaintEvent& event, FixedArray<float> const& samples)
17{
18 GUI::Frame::paint_event(event);
19 GUI::Painter painter(*this);
20
21 painter.add_clip_rect(event.rect());
22 painter.fill_rect(frame_inner_rect(), Color::Black);
23
24 int x_offset = frame_inner_rect().x();
25 int x = x_offset;
26 int y_offset = frame_inner_rect().center().y();
27
28 if (samples.size() > 0) {
29 float samples_per_pixel = samples.size() / static_cast<float>(frame_inner_rect().width());
30 float sample_index = 0;
31
32 while (sample_index < samples.size()) {
33 float sample = AK::abs(samples[sample_index]);
34 for (size_t i = 1; i < static_cast<size_t>(samples_per_pixel + 0.5f); i++)
35 sample = max(sample, AK::abs(samples[sample_index]));
36
37 Gfx::IntPoint min_point = { x, y_offset + static_cast<int>(-sample * frame_inner_rect().height() / 2) };
38 Gfx::IntPoint max_point = { x, y_offset + static_cast<int>(sample * frame_inner_rect().height() / 2) };
39 painter.draw_line(min_point, max_point, Color::Green);
40 sample_index += samples_per_pixel;
41 x++;
42 }
43 } else {
44 painter.draw_line({ x, y_offset }, { frame_inner_rect().width(), y_offset }, Color::Green);
45 }
46}