feat: add renderer.Layer
This commit is contained in:
		
							parent
							
								
									0493d3899a
								
							
						
					
					
						commit
						ca05f24873
					
				
					 2 changed files with 118 additions and 0 deletions
				
			
		
							
								
								
									
										117
									
								
								src/renderer/vaxis/Layer.zig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/renderer/vaxis/Layer.zig
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,117 @@ | ||||||
|  | const std = @import("std"); | ||||||
|  | const vaxis = @import("vaxis"); | ||||||
|  | 
 | ||||||
|  | pub const Plane = @import("Plane.zig"); | ||||||
|  | 
 | ||||||
|  | const Layer = @This(); | ||||||
|  | 
 | ||||||
|  | view: View, | ||||||
|  | y_off: i32 = 0, | ||||||
|  | x_off: i32 = 0, | ||||||
|  | plane_: Plane, | ||||||
|  | 
 | ||||||
|  | const View = struct { | ||||||
|  |     allocator: std.mem.Allocator, | ||||||
|  |     screen: vaxis.Screen, | ||||||
|  |     unicode: *const vaxis.Unicode, | ||||||
|  | 
 | ||||||
|  |     pub const Config = struct { | ||||||
|  |         h: u16, | ||||||
|  |         w: u16, | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     pub fn init(allocator: std.mem.Allocator, unicode: *const vaxis.Unicode, config: Config) std.mem.Allocator.Error!View { | ||||||
|  |         return .{ | ||||||
|  |             .allocator = allocator, | ||||||
|  |             .screen = try vaxis.Screen.init(allocator, .{ | ||||||
|  |                 .rows = config.h, | ||||||
|  |                 .cols = config.w, | ||||||
|  |                 .x_pixel = 0, | ||||||
|  |                 .y_pixel = 0, | ||||||
|  |             }), | ||||||
|  |             .unicode = unicode, | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn deinit(self: *View) void { | ||||||
|  |         self.screen.deinit(self.allocator); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | pub const Options = struct { | ||||||
|  |     y: i32 = 0, | ||||||
|  |     x: i32 = 0, | ||||||
|  |     h: u16 = 0, | ||||||
|  |     w: u16 = 0, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | pub fn init(allocator: std.mem.Allocator, unicode: *const vaxis.Unicode, opts: Options) std.mem.Allocator.Error!*Layer { | ||||||
|  |     const self = try allocator.create(Layer); | ||||||
|  |     self.* = .{ | ||||||
|  |         .view = try View.init(allocator, unicode, .{ | ||||||
|  |             .h = opts.h, | ||||||
|  |             .w = opts.w, | ||||||
|  |         }), | ||||||
|  |         .y_off = opts.y, | ||||||
|  |         .x_off = opts.x, | ||||||
|  |         .plane_ = undefined, | ||||||
|  |     }; | ||||||
|  |     const name = "layer"; | ||||||
|  |     self.plane_ = .{ | ||||||
|  |         .window = self.window(), | ||||||
|  |         .name_buf = undefined, | ||||||
|  |         .name_len = name.len, | ||||||
|  |     }; | ||||||
|  |     @memcpy(self.plane_.name_buf[0..name.len], name); | ||||||
|  |     return self; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn deinit(self: *Layer) void { | ||||||
|  |     const allocator = self.view.allocator; | ||||||
|  |     self.view.deinit(); | ||||||
|  |     allocator.destroy(self); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn window(self: *Layer) vaxis.Window { | ||||||
|  |     return .{ | ||||||
|  |         .x_off = 0, | ||||||
|  |         .y_off = 0, | ||||||
|  |         .parent_x_off = 0, | ||||||
|  |         .parent_y_off = 0, | ||||||
|  |         .width = self.view.screen.width, | ||||||
|  |         .height = self.view.screen.height, | ||||||
|  |         .screen = &self.view.screen, | ||||||
|  |         .unicode = self.view.unicode, | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn plane(self: *Layer) *Plane { | ||||||
|  |     return &self.plane_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn draw(self: *const Layer, plane_: Plane) void { | ||||||
|  |     if (self.x_off >= plane_.window.width) return; | ||||||
|  |     if (self.y_off >= plane_.window.height) return; | ||||||
|  | 
 | ||||||
|  |     const src_y = 0; | ||||||
|  |     const src_x = 0; | ||||||
|  |     const src_h: usize = self.view.screen.height; | ||||||
|  |     const src_w = self.view.screen.width; | ||||||
|  | 
 | ||||||
|  |     const dst_dim_y: i32 = @intCast(plane_.dim_y()); | ||||||
|  |     const dst_dim_x: i32 = @intCast(plane_.dim_x()); | ||||||
|  |     const dst_y = self.y_off; | ||||||
|  |     const dst_x = self.x_off; | ||||||
|  |     const dst_w = @min(src_w, dst_dim_x - dst_x); | ||||||
|  | 
 | ||||||
|  |     for (src_y..src_h) |src_row_| { | ||||||
|  |         const src_row: i32 = @intCast(src_row_); | ||||||
|  |         const src_row_offset = src_row * src_w; | ||||||
|  |         const dst_row_offset = (dst_y + src_row) * plane_.window.screen.width; | ||||||
|  |         if (dst_y + src_row > dst_dim_y) return; | ||||||
|  |         @memcpy( | ||||||
|  |             plane_.window.screen.buf[@intCast(dst_row_offset + dst_x)..@intCast(dst_row_offset + dst_x + dst_w)], | ||||||
|  |             self.view.screen.buf[@intCast(src_row_offset + src_x)..@intCast(src_row_offset + dst_w)], | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -9,6 +9,7 @@ const builtin = @import("builtin"); | ||||||
| const RGB = @import("color").RGB; | const RGB = @import("color").RGB; | ||||||
| 
 | 
 | ||||||
| pub const Plane = @import("Plane.zig"); | pub const Plane = @import("Plane.zig"); | ||||||
|  | pub const Layer = @import("Layer.zig"); | ||||||
| pub const Cell = @import("Cell.zig"); | pub const Cell = @import("Cell.zig"); | ||||||
| pub const CursorShape = vaxis.Cell.CursorShape; | pub const CursorShape = vaxis.Cell.CursorShape; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue