summaryrefslogtreecommitdiff
path: root/src/video.c
blob: be01f6dc66bf522c237ea6fd13856c59b8ed6453 (plain) (blame)
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
#include "video.h"
#include "utils.h"
#include "io.h"

void init_video(multiboot_info_t* p_multiboot_info) {
    #ifdef DEBUG
    macaroni_assert(p_multiboot_info->framebuffer_width == MULTIBOOT_GODS_WIDTH, "not gods width");
    macaroni_assert(p_multiboot_info->framebuffer_height == MULTIBOOT_GODS_HEIGHT, "not gods height");
    macaroni_assert(p_multiboot_info->framebuffer_bpp == MULTIBOOT_VIDEO_BPP, "not gods bpp");
    macaroni_assert(p_multiboot_info->framebuffer_type == MULTIBOOT_FRAMEBUFFER_TYPE_RGB, "not video fbtype");
    #endif

    #ifdef DEBUG
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_red_field_position);
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_red_mask_size);
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_green_field_position);
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_green_mask_size);
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_blue_field_position);
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_blue_mask_size);
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_bpp);
    serial_puthex((uint32_t) p_multiboot_info->framebuffer_pitch);
    #endif // DEBUG

    video_framebuffer = (uint8_t*) (uint32_t) p_multiboot_info->framebuffer_addr;
    pixel_width = (p_multiboot_info->framebuffer_bpp / 8);
    pitch = p_multiboot_info->framebuffer_pitch;
}

void put_pixel(macaroni_color color, uint16_t x, uint16_t y) {
    video_framebuffer[x * pixel_width + y * pitch] = color & 0xFF;
    video_framebuffer[x * pixel_width + y * pitch + 1] = (color >> 8) & 0xFF;
    video_framebuffer[x * pixel_width + y * pitch + 2] = (color >> 16) & 0xFF;
}