forked from AbleOS/ableos
52 lines
1.1 KiB
Plaintext
52 lines
1.1 KiB
Plaintext
|
.{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
|
||
|
}
|