mirror of https://github.com/0Nera/BMOSP.git
Создание модуля TGA
This commit is contained in:
parent
8ca0335c8f
commit
f4d5158799
|
@ -15,9 +15,6 @@ TERM_WALLPAPER=boot:///boot.jpg
|
||||||
KASLR=no
|
KASLR=no
|
||||||
KERNEL_PATH=boot:///kernel.elf
|
KERNEL_PATH=boot:///kernel.elf
|
||||||
|
|
||||||
MODULE_PATH=boot:///mod/cpubench.ko
|
|
||||||
MODULE_CMDLINE=[MOD]cpubench.ko
|
|
||||||
|
|
||||||
MODULE_PATH=boot:///mod/simd.ko
|
MODULE_PATH=boot:///mod/simd.ko
|
||||||
MODULE_CMDLINE=[MOD]simd.ko
|
MODULE_CMDLINE=[MOD]simd.ko
|
||||||
|
|
||||||
|
@ -33,5 +30,11 @@ TERM_WALLPAPER=boot:///boot.jpg
|
||||||
MODULE_PATH=boot:///mod/ps2.ko
|
MODULE_PATH=boot:///mod/ps2.ko
|
||||||
MODULE_CMDLINE=[MOD]ps2.ko
|
MODULE_CMDLINE=[MOD]ps2.ko
|
||||||
|
|
||||||
|
MODULE_PATH=boot:///mod/cpubench.ko
|
||||||
|
MODULE_CMDLINE=[MOD]cpubench.ko
|
||||||
|
|
||||||
|
MODULE_PATH=boot:///mod/tga.ko
|
||||||
|
MODULE_CMDLINE=[MOD]tga.ko
|
||||||
|
|
||||||
MODULE_PATH=boot:///boot.tga
|
MODULE_PATH=boot:///boot.tga
|
||||||
MODULE_CMDLINE=[BOOTIMG]
|
MODULE_CMDLINE=[BOOTIMG]
|
|
@ -0,0 +1,17 @@
|
||||||
|
#/bin/sh
|
||||||
|
echo "Название: TGA"
|
||||||
|
echo "Лицензия: Публичное достояние"
|
||||||
|
|
||||||
|
CC="gcc"
|
||||||
|
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||||
|
|
||||||
|
if [ -d "../../sdk" ]; then
|
||||||
|
CC="../../sdk/bin/x86_64-elf-gcc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o tga.o
|
||||||
|
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none tga.o -o tga.ko
|
||||||
|
|
||||||
|
cp tga.ko ../bin/
|
||||||
|
echo "Сборка завершена, файл: tga.ko"
|
|
@ -1,19 +1,6 @@
|
||||||
/**
|
#include <system.h>
|
||||||
* main.c
|
|
||||||
* Точка входа окончания загрузки
|
|
||||||
*
|
|
||||||
* Функции эффектов после полной инициализации ядра
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fb.h>
|
#define TGA_ERR( ) fb_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
||||||
#include <mem.h>
|
|
||||||
#include <tool.h>
|
|
||||||
|
|
||||||
#define TGA_ERR( ) LOG("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
|
||||||
|
|
||||||
extern void *bootpng_ptr;
|
|
||||||
extern uint64_t bootpng_size;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned char magic1; // должно быть нулевым
|
unsigned char magic1; // должно быть нулевым
|
||||||
|
@ -29,25 +16,21 @@ typedef struct {
|
||||||
unsigned char pixeltype; // должно быть 40
|
unsigned char pixeltype; // должно быть 40
|
||||||
} __attribute__((packed)) tga_header_t;
|
} __attribute__((packed)) tga_header_t;
|
||||||
|
|
||||||
unsigned int *tga_parse(unsigned char *ptr, int size) {
|
static unsigned int *tga_parse(unsigned char *ptr, int size) {
|
||||||
unsigned int *data;
|
unsigned int *data;
|
||||||
int i, j, k, x, y, w = (ptr[13] << 8) + ptr[12], h = (ptr[15] << 8) + ptr[14], o = (ptr[11] << 8) + ptr[10];
|
int i, j, k, x, y, w = (ptr[13] << 8) + ptr[12], h = (ptr[15] << 8) + ptr[14], o = (ptr[11] << 8) + ptr[10];
|
||||||
int m = ((ptr[1] ? (ptr[7] >> 3) * ptr[5] : 0) + 18);
|
int m = ((ptr[1] ? (ptr[7] >> 3) * ptr[5] : 0) + 18);
|
||||||
|
|
||||||
if (w < 1 || h < 1) return NULL;
|
if (w < 1 || h < 1) return NULL;
|
||||||
|
|
||||||
data = (unsigned int *)mem_alloc((w * h + 2) * sizeof(unsigned int));
|
data = (unsigned int *)alloc((w * h + 2) * sizeof(unsigned int));
|
||||||
if (!data) {
|
if (!data) { return NULL; }
|
||||||
LOG("Ошибка декодирования TGA на строчке: %u, %x, %u kb\n", __LINE__, data,
|
|
||||||
((w * h + 2) * sizeof(unsigned int)) / 1024);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ptr[2]) {
|
switch (ptr[2]) {
|
||||||
case 1:
|
case 1:
|
||||||
if (ptr[6] != 0 || ptr[4] != 0 || ptr[3] != 0 || (ptr[7] != 24 && ptr[7] != 32)) {
|
if (ptr[6] != 0 || ptr[4] != 0 || ptr[3] != 0 || (ptr[7] != 24 && ptr[7] != 32)) {
|
||||||
TGA_ERR( );
|
TGA_ERR( );
|
||||||
mem_free(data);
|
free(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (y = i = 0; y < h; y++) {
|
for (y = i = 0; y < h; y++) {
|
||||||
|
@ -62,7 +45,7 @@ unsigned int *tga_parse(unsigned char *ptr, int size) {
|
||||||
case 2:
|
case 2:
|
||||||
if (ptr[5] != 0 || ptr[6] != 0 || ptr[1] != 0 || (ptr[16] != 24 && ptr[16] != 32)) {
|
if (ptr[5] != 0 || ptr[6] != 0 || ptr[1] != 0 || (ptr[16] != 24 && ptr[16] != 32)) {
|
||||||
TGA_ERR( );
|
TGA_ERR( );
|
||||||
mem_free(data);
|
free(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (y = i = 0; y < h; y++) {
|
for (y = i = 0; y < h; y++) {
|
||||||
|
@ -77,7 +60,7 @@ unsigned int *tga_parse(unsigned char *ptr, int size) {
|
||||||
case 9:
|
case 9:
|
||||||
if (ptr[6] != 0 || ptr[4] != 0 || ptr[3] != 0 || (ptr[7] != 24 && ptr[7] != 32)) {
|
if (ptr[6] != 0 || ptr[4] != 0 || ptr[3] != 0 || (ptr[7] != 24 && ptr[7] != 32)) {
|
||||||
TGA_ERR( );
|
TGA_ERR( );
|
||||||
mem_free(data);
|
free(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
y = i = 0;
|
y = i = 0;
|
||||||
|
@ -113,7 +96,7 @@ unsigned int *tga_parse(unsigned char *ptr, int size) {
|
||||||
case 10:
|
case 10:
|
||||||
if (ptr[5] != 0 || ptr[6] != 0 || ptr[1] != 0 || (ptr[16] != 24 && ptr[16] != 32)) {
|
if (ptr[5] != 0 || ptr[6] != 0 || ptr[1] != 0 || (ptr[16] != 24 && ptr[16] != 32)) {
|
||||||
TGA_ERR( );
|
TGA_ERR( );
|
||||||
mem_free(data);
|
free(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
y = i = 0;
|
y = i = 0;
|
||||||
|
@ -148,7 +131,7 @@ unsigned int *tga_parse(unsigned char *ptr, int size) {
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
TGA_ERR( );
|
TGA_ERR( );
|
||||||
mem_free(data);
|
free(data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -156,17 +139,25 @@ unsigned int *tga_parse(unsigned char *ptr, int size) {
|
||||||
data[1] = h;
|
data[1] = h;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
void main( ) {
|
|
||||||
for (uint64_t i = 512; i > 1; i--) { pause( ); }
|
|
||||||
LOG("Загрузка завершена! 1\n");
|
|
||||||
unsigned int *res = tga_parse((uint8_t *)bootpng_ptr, bootpng_size);
|
|
||||||
LOG("Загрузка завершена! 2 %x\n", res);
|
|
||||||
|
|
||||||
tga_header_t *head = (tga_header_t *)bootpng_ptr;
|
static void *handler(uint64_t func) {
|
||||||
|
switch (func) {
|
||||||
|
case 0: return &tga_parse;
|
||||||
|
|
||||||
if (res != NULL) { LOG("Размер экрана загрузки: %ux%u \n", res[0], res[1]); }
|
default: return NULL;
|
||||||
LOG("Размер экрана загрузки: %ux%u \n", head->h, head->w);
|
}
|
||||||
mem_dump_memory( );
|
}
|
||||||
|
|
||||||
fb_print_buf(0, 0, head->w, head->h, (uint32_t *)(res + 2));
|
module_info_t __attribute__((section(".minit"))) init(env_t *env) {
|
||||||
|
init_env(env);
|
||||||
|
return (module_info_t){ .name = (char *)"[MEDIA][TGA]",
|
||||||
|
.message = (char *)"Отрисовка TGA изображений",
|
||||||
|
.type = 0,
|
||||||
|
.data_size = 0,
|
||||||
|
.data = (void *)0,
|
||||||
|
.err_code = 0,
|
||||||
|
.module_id = 0,
|
||||||
|
.irq = 0,
|
||||||
|
.irq_handler = 0,
|
||||||
|
.get_func = handler };
|
||||||
}
|
}
|
Loading…
Reference in New Issue