Serenity Operating System
at master 46 lines 1.6 kB view raw
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}