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
#![allow(missing_docs)]
use crate::graphics::Color;
use crate::graphics::DrawContext;
use super::context::bindings::types::*;
use super::context::bindings::{
BLEND, COLOR_BUFFER_BIT, COLOR_CLEAR_VALUE, ONE_MINUS_SRC_ALPHA,
PACK_ALIGNMENT, RGBA, SRC_ALPHA, UNSIGNED_BYTE, VIEWPORT,
};
use super::drawparams::DrawParams;
use super::{Mat4, OpenGlContext, OpenGlRenderPlatform};
pub struct Window {
ctx: OpenGlContext,
}
impl Window {
pub fn new(ctx: OpenGlContext) -> Self {
Window { ctx }
}
pub fn clear_color(&mut self, color: Color) {
let (r, g, b, a) = color.rgba();
unsafe {
self.ctx.bindings.ClearColor(r, g, b, a);
}
}
pub fn get_clear_color(&self) -> Color {
let mut array = [0f32; 4];
unsafe {
self.ctx
.bindings
.GetFloatv(COLOR_CLEAR_VALUE, array.as_mut_ptr());
}
Color::create_rgba(array[0], array[1], array[2], array[3])
}
pub fn viewport(&mut self, x: i32, y: i32, width: u32, height: u32) {
unsafe {
self.ctx.bindings.Viewport(
x as GLint,
y as GLint,
width as GLsizei,
height as GLsizei,
);
}
self.ctx.mask.mask_size(&self.ctx.bindings, width, height);
}
pub fn prepare_draw(
&mut self,
screen_size: (f32, f32),
first_pass: bool,
) -> DrawContext<OpenGlRenderPlatform> {
unsafe {
self.ctx.bindings.Enable(BLEND);
self.ctx.bindings.BlendFunc(SRC_ALPHA, ONE_MINUS_SRC_ALPHA);
}
let mut params = DrawParams::new();
params.transform(
Mat4::translate(-1.0, -1.0)
* Mat4::scale(2.0 / screen_size.0, 2.0 / screen_size.1),
);
DrawContext::new(&mut self.ctx, params, first_pass)
}
pub fn clear(&mut self) {
unsafe {
self.ctx.bindings.Clear(COLOR_BUFFER_BIT);
}
}
pub fn flip(&mut self) {}
pub fn take_screenshot(&self) -> Box<[u8]> {
let mut answer: [GLint; 4] = [0; 4];
unsafe {
self.ctx.bindings.GetIntegerv(VIEWPORT, answer.as_mut_ptr());
self.ctx.bindings.PixelStorei(PACK_ALIGNMENT, 1);
}
let x = answer[0];
let y = answer[1];
let width = answer[2] as GLsizei;
let height = answer[3] as GLsizei;
let pixel_size = 4;
let buflen = pixel_size * (width as usize) * (height as usize);
let mut buffer = vec![0u8; buflen].into_boxed_slice();
unsafe {
self.ctx.bindings.ReadPixels(
x,
y,
width,
height,
RGBA,
UNSIGNED_BYTE,
buffer.as_mut_ptr() as *mut _,
);
}
buffer
}
}