mineswefi.git

io.h

espurr
/* mineswefi - uefi minesweeper
 * Copyright (C) 2025 ArcNyxx <olive@arcnyxx.net>
 * see LICENCE file for licensing information */

#ifndef EFI_IO_H
#define EFI_IO_H

#include <stdbool.h>

typedef struct efi_key {
        uint16_t scancode;
        int16_t ch;
} efi_key_t;

typedef struct efi_text_input efi_text_input_t;
struct efi_text_input {
        uint64_t (*reset)(efi_text_input_t *this, bool ext);
        uint64_t (*read)(efi_text_input_t *this, efi_key_t *key);
        void *wait;
};

typedef struct efi_text_output efi_text_output_t;
struct efi_text_output {
        uint64_t (*reset)(efi_text_output_t *this, bool ext);
        uint64_t (*print)(efi_text_output_t *this, const uint16_t *str);
        uint64_t (*test)(efi_text_output_t *this, const uint16_t *str);
        uint64_t (*getmode)(efi_text_output_t *this, uint64_t mode,
			uint64_t *cols, uint64_t *rows);
        uint64_t (*setmode)(efi_text_output_t *this, uint64_t mode);
        uint64_t (*setattr)(efi_text_output_t *this, uint64_t attr);
        uint64_t (*clear)(efi_text_output_t *this);
        uint64_t (*movecur)(efi_text_output_t *this,
			uint64_t col, uint64_t row);
        uint64_t (*showcur)(efi_text_output_t *this, bool visible);
};

typedef struct efi_pointer_state {
        int32_t x, y, z;
        bool left, right;
} efi_pointer_state_t;

typedef struct efi_pointer efi_pointer_t;
struct efi_pointer {
        uint64_t (*reset)(efi_pointer_t *this, bool ext);
        uint64_t (*query)(efi_pointer_t *this, efi_pointer_state_t *state);
        void *wait;

        struct {
                uint64_t x, y, z;
                bool left, right;
        } mode;
};

typedef enum efi_pixel_format {
	EFI_PIXEL_FORMAT_RGB,
	EFI_PIXEL_FORMAT_BGR,
	EFI_PIXEL_FORMAT_BIT_MASK,
	EFI_PIXEL_FORMAT_BLT_ONLY
} efi_pixel_format_t;

typedef struct efi_pixel_bitmask {
	uint32_t r, g, b, reserved;
} efi_pixel_bitmask_t;

typedef struct efi_graphics_info {
	uint32_t version;
	uint32_t hres;
	uint32_t vres;
	efi_pixel_format_t format;
	efi_pixel_bitmask_t info;
	uint32_t hlen;
} efi_graphics_info_t;

typedef struct efi_graphics_mode {
	uint32_t modes;
	uint32_t mode;
	efi_graphics_info_t *info;
	uint64_t info_size;
	void *buffer;
	uint64_t buffer_size;
} efi_graphics_mode_t;

typedef struct efi_pixel {
	uint8_t b, g, r, reserved;
} efi_pixel_t;

typedef enum efi_graphics_op {
	EFI_GRAPHICS_OP_BUFFER_TO_SCREEN,
	EFI_GRAPHICS_OP_SCREEN_TO_BUFFER,
	EFI_GRAPHICS_OP_BUFFER_OFFSET_TO_SCREEN,
	EFI_GRAPHICS_OP_SCREEN_TO_SCREEN
} efi_graphics_op_t;

typedef struct efi_graphics efi_graphics_t;
struct efi_graphics {
        uint64_t (*query)(efi_graphics_t *this, uint32_t mode,
			uint64_t *size, efi_graphics_mode_t **info);
        uint64_t (*set)(efi_graphics_t *this, uint32_t mode);
        uint64_t (*draw)(efi_graphics_t *this, efi_pixel_t *buf,
			efi_graphics_op_t op, uint64_t srcx, uint64_t srcy,
			uint64_t destx, uint64_t desty, uint64_t width,
			uint64_t height, uint64_t delta);
        void *mode;
};

#endif /* EFI_IO_H */