73 lines
2.0 KiB
Zig
73 lines
2.0 KiB
Zig
const Platform = @import("platform");
|
|
const Gfx = Platform.Gfx;
|
|
const Color = Platform.Color;
|
|
|
|
const Vec2 = Platform.Math.Vec2;
|
|
|
|
const Canvas = @This();
|
|
|
|
size: Vec2,
|
|
|
|
fn getScale(self: Canvas) f32 {
|
|
const window_size = Gfx.getWindowSize();
|
|
const canvas_size = self.size;
|
|
|
|
const scale_x = window_size.x / canvas_size.x;
|
|
const scale_y = window_size.y / canvas_size.y;
|
|
return @min(scale_x, scale_y);
|
|
}
|
|
|
|
fn getScaledCanvas(self: Canvas) Vec2 {
|
|
return self.size.multiplyScalar(self.getScale());
|
|
}
|
|
|
|
pub fn push(self: Canvas) void {
|
|
Gfx.transformPush();
|
|
|
|
const scale = self.getScale();
|
|
const window_size = Gfx.getWindowSize();
|
|
const scaled_canvas = self.size.multiplyScalar(scale);
|
|
|
|
Gfx.transformTranslate(.init(
|
|
(window_size.x - scaled_canvas.x) / 2,
|
|
(window_size.y - scaled_canvas.y) / 2,
|
|
));
|
|
|
|
Gfx.transformScale(.init(scale, scale));
|
|
}
|
|
|
|
pub fn pop(self: Canvas, maybe_color: ?Color) void {
|
|
Gfx.transformPop();
|
|
|
|
if (maybe_color) |color| {
|
|
const scale = self.getScale();
|
|
const window_size = Gfx.getWindowSize();
|
|
const scaled_canvas = self.size.multiplyScalar(scale);
|
|
if (window_size.x > scaled_canvas.x) {
|
|
const margin_x = (window_size.x - scaled_canvas.x) / 2;
|
|
Gfx.drawRectangle(
|
|
.init(0, 0),
|
|
.init(margin_x, window_size.y),
|
|
color
|
|
);
|
|
Gfx.drawRectangle(
|
|
.init(window_size.x-margin_x, 0),
|
|
.init(margin_x, window_size.y),
|
|
color
|
|
);
|
|
} else {
|
|
const margin_y = (window_size.y - scaled_canvas.y) / 2;
|
|
Gfx.drawRectangle(
|
|
.init(0, 0),
|
|
.init(window_size.x, margin_y),
|
|
color
|
|
);
|
|
Gfx.drawRectangle(
|
|
.init(0, window_size.y-margin_y),
|
|
.init(window_size.x, margin_y),
|
|
color
|
|
);
|
|
}
|
|
}
|
|
}
|