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
use anyhow::Result;
use buffer_graphics_lib::prelude::*;
use buffer_graphics_lib::renderable_image::RenderableImage;
use buffer_graphics_lib::renderable_macros::DrawOffset;
use buffer_graphics_lib::text::PixelFont::*;
use graphics_shapes::shape_box::ShapeBox;
use std::fs;
fn main() -> Result<()> {
let mut buffer = Graphics::create_buffer_u8(400, 400);
let mut graphics = Graphics::new_u8_rgba(&mut buffer, 400, 400)?;
draw_some_text(&mut graphics);
draw_some_shapes(&mut graphics);
draw_to_image(&mut graphics);
draw_some_images(&mut graphics)?;
draw_reversed(&mut graphics);
Ok(())
}
fn draw_some_text(graphics: &mut Graphics) {
//Text can be drawn in several ways
//1 directly using `draw_text`
//this is the least efficient way
graphics.draw_text(
"This is some text",
TextPos::Px(20, 20),
(WHITE, Standard6x7),
);
//draws the string "This is some text" at pixel 20x20 using font Standard6x7 in white
//2 using `draw` with pre measured text
let text = Text::new(
"More example text",
TextPos::ColRow(6, 5),
(RED, Standard4x5, WrappingStrategy::SpaceBeforeCol(8)),
);
graphics.draw(&text);
//draws the string "More example text" at column 6, row 5 using font Standard4x5 in red, wrapping at the first space before column 14 (6 + 8)
//columns and rows are based on the font size so ColRow(2,2) for Standard6x7 and Standard4x5 would be in different locations on screen
//The last param of text is `TextFormat`
//it can be created with `TextFormat::new(...)` or with
//Color
//(Color, PixelFont)
//(Color, PixelFont, Positioning)
//(Color, PixelFont, WrappingStrategy)
//(Color, PixelFont, WrappingStrategy, Positioning)
//(Color, PixelFont, WrappingStrategy, f32 [line height])
//(Color, PixelFont, WrappingStrategy, f32 [line height], f32 [char width])
//(Color, PixelFont, WrappingStrategy, f32 [line height], f32 [char width], Positioning)
}
fn draw_some_shapes(graphics: &mut Graphics) {
//Shapes can also be drawn in multiple ways
//1 directly with `draw_rect`, `draw_circle`
graphics.draw_triangle(Triangle::new((40, 40), (80, 40), (80, 40)), stroke(YELLOW));
//2 using `Drawable`, stores the color with the shape
let rect = Rect::new((10, 10), (80, 80));
let drawable = Drawable::from_obj(rect, fill(ORANGE));
graphics.draw(&drawable);
//3 `ShapeBox`, these are used so shapes can be treated generically
let shape_box = ShapeBox::from(Circle::new((60, 60), 40));
let drawable_box = Drawable::from_obj(shape_box, stroke(GREEN));
graphics.draw(&drawable_box);
//4 in bulk using a `ShapeCollection`
let mut collection = ShapeCollection::default();
InsertShape::insert(
&mut collection,
0,
Line::new((14, 12), (78, 23)),
stroke(MID_GRAY),
);
let drawable = Drawable::from_obj(ShapeBox::from(Circle::new((14, 12), 10)), stroke(BLUE));
InsertDrawable::insert(&mut collection, 0, drawable);
graphics.draw(&collection);
}
#[allow(unused_variables)]
fn draw_to_image(graphics: &mut Graphics) {
//The canvas can be written to `Image` or `IndexedImage`
let image = graphics.copy_to_image();
//this can then be written to disk or drawn back on the buffer
}
fn draw_some_images(graphics: &mut Graphics) -> Result<()> {
//Image are normal images such as png or jpeg
//IndexedImage are .ici (from `ici-files`)
//1 Images
let png = open_image("examples/sample.png")?;
graphics.draw_image((40, 40), &png);
//2 IndexedImages
let (ici, _) = IndexedImage::from_file_contents(&fs::read("examples/sample.ici")?)?;
graphics.draw_indexed_image((50, 50), &ici);
//3 These can also be stored as `RenderableImage` or `RenderableIndexedImage`
let image = RenderableImage::new(png, (67, 12), DrawOffset::TopLeft);
image.render(graphics);
Ok(())
}
fn draw_reversed(graphics: &mut Graphics) {
//Most things can also be drawn by passing them `Graphics` instead
let drawable = Drawable::from_obj(Line::new((0, 0), (100, 100)), stroke(PURPLE));
drawable.render(graphics);
let text = Text::new(
"SAMPLE TEXT",
TextPos::px(coord!(60, 60)),
(MAGENTA, Limited3x5),
);
text.render(graphics);
}