This repository has been archived on 2021-12-01. You can view files and clone it, but cannot push or open issues/pull-requests.
AGL_Simple_Impl/src/graphics_api_impl.rs

111 lines
2.9 KiB
Rust

#![allow(dead_code, unused)]
use ab_glyph::FontRef;
use able_graphics_library::{AglApi, FrameBuffer, Point, HEIGHT, RGBA, WIDTH};
use mini_gl_fb::glutin::platform::unix::x11::ffi::XK_R10;
#[derive(Clone, Debug, Copy)]
pub struct GraphicsRenderer {
pub buff: FrameBuffer,
}
impl GraphicsRenderer {
pub fn new() -> GraphicsRenderer {
let rgba = RGBA {
r: 0,
g: 0,
b: 0,
a: 0,
};
let buffer = [rgba; WIDTH * HEIGHT];
Self { buff: buffer }
}
}
impl AglApi for GraphicsRenderer {
fn put_line(&mut self, coords_start: Point, coords_end: Point, thickness: u32, color: RGBA) {
// Wikipedia's naive line drawing algorithm
let x1 = coords_start.x;
let y1 = coords_start.y;
let x2 = coords_end.x;
let y2 = coords_end.y;
let dx = x2 - x1;
let dy = y2 - y1;
for x in x1..x2 {
let y = y1 + dy * (x - x1) / dx;
let coordinates = x + (WIDTH as u16) * y;
self.buff[coordinates as usize] = color;
}
}
fn put_rect(&mut self, coords_start: Point, coords_end: Point, color: RGBA) {
todo!();
}
fn put_circle(&mut self, coords: Point, radius: u32) {
todo!();
}
fn put_pixel(&mut self, coords: Point, color: RGBA) {
let coordinates = coords.x + (WIDTH as u16).wrapping_mul(coords.y);
self.buff[coordinates as usize] = color;
}
fn put_triangle(
&mut self,
coords_1: Point,
coords_2: Point,
coords_3: Point,
thickness: u32,
color: RGBA,
) {
todo!();
}
fn paint_cursor(&mut self, coords: Point) {
todo!();
}
fn hide_cursor() {
todo!();
}
fn show_cursor() {
todo!();
}
fn draw_text(&mut self, coords: Point, scale: u8, color: RGBA, text: String) {
use ab_glyph::{point, Font, FontRef, Glyph};
let font: FontRef =
FontRef::try_from_slice(include_bytes!("../font/Roboto-Regular.ttf")).unwrap();
// Get a glyph for 'q' with a scale & position.
let q_glyph: Glyph = font
.glyph_id('a')
.with_scale_and_position(scale as f32, point(coords.x as f32, coords.y as f32));
// Draw it.
if let Some(q) = font.outline_glyph(q_glyph) {
q.draw(|x, y, c| {
/* draw pixel `(x, y)` with coverage: `c` */
println!("h");
self.put_pixel(
Point {
x: x as u16,
y: y as u16,
},
color,
);
});
}
}
/// Actually move the double buffer to the single buffer and "update" the screen
fn draw(&mut self) {}
fn clear(&mut self, color: RGBA) {
for x in 0..600 * 400 {
self.buff[x as usize] = color;
}
}
}