.{Color, Surface, new_surface, put_surface} := @use("../lib.hb"); .{log, memory} := @use("../../../stn/src/lib.hb") BitmapFileHeader := packed struct { magic: u16, size: u32, reserved_1: u16, reserved_2: u16, offset: u32, } BitmapInfoHeader := packed struct { size: u32, width: i32, height: i32, planes: u16, bits: u16, compression: u32, image_size: u32, x_resolution: i32, y_resolution: i32, n_colours: u32, important_colours: u32, } BitmapColorHeader := packed struct { red_mask: u32, green_mask: u32, blue_mask: u32, alpha_mask: u32, color_space_type: u32, unused: u32, } from := fn(bmp: ^u8): ?Surface { file_header := @as(^BitmapFileHeader, @bitcast(bmp)) info_header := @as(^BitmapInfoHeader, @bitcast(bmp + @sizeof(BitmapFileHeader))) bmp += file_header.offset if file_header.magic != 0x4D42 | info_header.width == 0 | info_header.height == 0 { log.error("Invalid BMP image.\0") return null } width := @as(uint, info_header.width) height := @as(uint, info_header.height) lhs := Surface.(@bitcast(bmp), width, height) rhs := new_surface(width, height) put_surface(rhs, lhs, .(0, 0), true) return rhs }