1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
use super::{bindings as b, *};
use crate::fs::{Font, Image, SubImage};
/// Fill the whole frame with the given color.
pub fn clear_screen(c: Color) {
unsafe {
b::clear_screen(c.into());
}
}
/// Set a color value in the palette.
pub fn set_color(c: Color, v: RGB) {
unsafe {
b::set_color(c.into(), v.r.into(), v.g.into(), v.b.into());
}
}
/// Set a single point (1 pixel is scaling is 1) on the frame.
pub fn draw_point(p: Point, c: Color) {
unsafe {
b::draw_point(p.x, p.y, c.into());
}
}
/// Draw a straight line from point a to point b.
pub fn draw_line(a: Point, b: Point, s: LineStyle) {
unsafe {
b::draw_line(a.x, a.y, b.x, b.y, s.color.into(), s.width);
}
}
/// Draw a rectangle filling the given bounding box.
pub fn draw_rect(p: Point, b: Size, s: Style) {
unsafe {
b::draw_rect(
p.x,
p.y,
b.width,
b.height,
s.fill_color.into(),
s.stroke_color.into(),
s.stroke_width,
);
}
}
/// Draw a rectangle with rounded corners.
pub fn draw_rounded_rect(p: Point, b: Size, corner: Size, s: Style) {
unsafe {
b::draw_rounded_rect(
p.x,
p.y,
b.width,
b.height,
corner.width,
corner.height,
s.fill_color.into(),
s.stroke_color.into(),
s.stroke_width,
);
}
}
/// Draw a circle with the given diameter.
pub fn draw_circle(p: Point, d: i32, s: Style) {
unsafe {
b::draw_circle(
p.x,
p.y,
d,
s.fill_color.into(),
s.stroke_color.into(),
s.stroke_width,
);
}
}
/// Draw an ellipse (oval).
pub fn draw_ellipse(p: Point, b: Size, s: Style) {
unsafe {
b::draw_ellipse(
p.x,
p.y,
b.width,
b.height,
s.fill_color.into(),
s.stroke_color.into(),
s.stroke_width,
);
}
}
/// Draw a triangle.
///
/// The order of points doesn't matter.
pub fn draw_triangle(a: Point, b: Point, c: Point, s: Style) {
unsafe {
b::draw_triangle(
a.x,
a.y,
b.x,
b.y,
c.x,
c.y,
s.fill_color.into(),
s.stroke_color.into(),
s.stroke_width,
);
}
}
/// Draw an arc.
pub fn draw_arc(p: Point, d: i32, start: Angle, sweep: Angle, s: Style) {
unsafe {
b::draw_arc(
p.x,
p.y,
d,
start.0,
sweep.0,
s.fill_color.into(),
s.stroke_color.into(),
s.stroke_width,
);
}
}
/// Draw a sector.
pub fn draw_sector(p: Point, d: i32, start: Angle, sweep: Angle, s: Style) {
unsafe {
b::draw_sector(
p.x,
p.y,
d,
start.0,
sweep.0,
s.fill_color.into(),
s.stroke_color.into(),
s.stroke_width,
);
}
}
/// Render text using the given font.
///
/// Unlike in the other drawing functions, here [Point] points not to the top-left corner
/// but to the baseline start position.
pub fn draw_text(t: &str, f: &Font, p: Point, c: Color) {
let text_ptr = t.as_ptr();
let text_len = t.len();
let font_ptr = f.raw.as_ptr();
let font_len = f.raw.len();
unsafe {
b::draw_text(
text_ptr as u32,
text_len as u32,
font_ptr as u32,
font_len as u32,
p.x,
p.y,
c.into(),
);
}
}
/// Render an image using the given colors.
pub fn draw_image(i: &Image, p: Point) {
let ptr = i.raw.as_ptr();
let len = i.raw.len();
unsafe {
b::draw_image(ptr as u32, len as u32, p.x, p.y);
}
}
/// Draw a subregion of an image.
///
/// Most often used to draw a sprite from a sprite atlas.
pub fn draw_sub_image(i: &SubImage, p: Point) {
let ptr = i.raw.as_ptr();
let len = i.raw.len();
unsafe {
b::draw_sub_image(
ptr as u32,
len as u32,
p.x,
p.y,
i.point.x,
i.point.y,
i.size.width,
i.size.height,
);
}
}