9 bool tga_extract_info(
const char* path, tga_header_t* out_meta){
16 fread(file,
sizeof(tga_header_t), 1, out_meta);
24 int tga_extract_pixels(
const char* path, uint32_t* pixel_buf) {
31 fseek(file, 0, SEEK_END);
35 fseek(file, 0, SEEK_SET);
37 uint8_t* file_data = kcalloc(
filesize, 1);
43 tga_header_t* targa_header = (tga_header_t*)file_data;
45 char* data = (
char*)file_data +
sizeof(tga_header_t);
56 o = (file_data[11] << 8) + file_data[10];
58 int m = (targa_header->colormap ? (file_data[7]>>3) * file_data[5] : 0) + 18;
64 if (targa_header->image_type != 1
65 && targa_header->image_type != 2
66 && targa_header->image_type != 9
67 && targa_header->image_type != 10)
72 switch(targa_header->image_type) {
73 case TGA_MODE_UC_CMI: {
77 || (file_data[7]!=24 && file_data[7]!=32)) {
81 for(y = i = 0; y<h; y++) {
84 j = file_data[m + k++]*(file_data[7]>>3) + 18;
87 int a = file_data[j+1];
88 int b = file_data[j+2];
89 int r = (file_data[7]==32?file_data[j+3]:0xff);
92 y * targa_header->w + x
101 case TGA_MODE_UC_RGB:{
102 if(file_data[5]!=0 || file_data[6]!=0 || file_data[1]!=0 || (file_data[16]!=24 && file_data[16]!=32)) {
106 for(y = i = 0; y < h; y++) {
107 j = (!o ? h - y - 1 : y) * w * (targa_header->bpp >> 3);
108 for(x = 0; x < w; x++) {
109 int g = file_data[j];
110 int a = file_data[j+1];
111 int b = file_data[j+2];
112 int r = (targa_header->bpp == 32 ? file_data[j+3] : 0xff);
115 y * targa_header->w + x
121 j += targa_header->bpp >> 3;
126 case TGA_MODE_RL_RGB: {
127 if(file_data[5]!=0 || file_data[6]!=0 || file_data[1]!=0 || (file_data[16]!=24 && file_data[16]!=32)) {
133 size_t current_processing = 0;
138 while(cur_y < targa_header->h) {
139 uint8_t rep_count_raw = data[current_processing++];
140 uint8_t repetition_count = (rep_count_raw & 0b01111111) + 1;
143 bool is_raw = ((rep_count_raw & 0b10000000) >> 7);
151 r = data[current_processing++] & 0xff;
152 g = data[current_processing++] & 0xff;
153 b = data[current_processing++] & 0xff;
155 if(targa_header->bpp == 32)
156 a = data[current_processing++] & 0xff;
160 while(repetition_count--) {
161 if(cur_x >= targa_header->w) {
171 cur_y * targa_header->w + cur_x
180 while(repetition_count--) {
181 r = data[current_processing++] & 0xff;
182 g = data[current_processing++] & 0xff;
183 b = data[current_processing++] & 0xff;
185 if(targa_header->bpp == 32)
186 a = data[current_processing++];
190 if(cur_x >= targa_header->w) {
200 cur_y * targa_header->w + cur_x
215 qemu_err(
"Error: Mode not implemented: %d\n", targa_header->image_type);
227 int tga_extract_pixels_from_data(
const char* raw_data, uint32_t* pixel_buf) {
228 ON_NULLPTR(raw_data, {
232 tga_header_t* targa_header = (tga_header_t*)raw_data;
234 qemu_warn(
"W: %d", targa_header->w);
235 qemu_warn(
"H: %d", targa_header->h);
236 qemu_warn(
"BPP: %d", targa_header->bpp);
238 char* data = (
char*)raw_data +
sizeof(tga_header_t);
249 o = (raw_data[11] << 8) + raw_data[10];
251 int m = (targa_header->colormap ? (raw_data[7]>>3) * raw_data[5] : 0) + 18;
257 if (targa_header->image_type != 1
258 && targa_header->image_type != 2
259 && targa_header->image_type != 9
260 && targa_header->image_type != 10)
265 switch(targa_header->image_type) {
266 case TGA_MODE_UC_CMI: {
270 || (raw_data[7]!=24 && raw_data[7]!=32)) {
274 for(y = i = 0; y<h; y++) {
275 k = ((!o?h-y-1:y)*w);
277 j = raw_data[m + k++]*(raw_data[7]>>3) + 18;
280 int a = raw_data[j+1];
281 int b = raw_data[j+2];
282 int r = (raw_data[7]==32?raw_data[j+3]:0xff);
285 y * targa_header->w + x
294 case TGA_MODE_UC_RGB:{
295 if(raw_data[5]!=0 || raw_data[6]!=0 || raw_data[1]!=0 || (raw_data[16]!=24 && raw_data[16]!=32)) {
299 for(y = i = 0; y < h; y++) {
300 j = (!o ? h - y - 1 : y) * w * (targa_header->bpp >> 3);
301 for(x = 0; x < w; x++) {
303 int a = raw_data[j+1];
304 int b = raw_data[j+2];
305 int r = (targa_header->bpp == 32 ? raw_data[j+3] : 0xff);
308 y * targa_header->w + x
314 j += targa_header->bpp >> 3;
319 case TGA_MODE_RL_RGB: {
320 if(raw_data[5]!=0 || raw_data[6]!=0 || raw_data[1]!=0 || (raw_data[16]!=24 && raw_data[16]!=32)) {
326 size_t current_processing = 0;
331 while(cur_y < targa_header->h) {
332 uint8_t rep_count_raw = data[current_processing++];
333 uint8_t repetition_count = (rep_count_raw & 0b01111111) + 1;
336 bool is_raw = ((rep_count_raw & 0b10000000) >> 7);
344 r = data[current_processing++] & 0xff;
345 g = data[current_processing++] & 0xff;
346 b = data[current_processing++] & 0xff;
348 if(targa_header->bpp == 32)
349 a = data[current_processing++] & 0xff;
353 while(repetition_count--) {
354 if(cur_x >= targa_header->w) {
364 cur_y * targa_header->w + cur_x
373 while(repetition_count--) {
374 r = data[current_processing++] & 0xff;
375 g = data[current_processing++] & 0xff;
376 b = data[current_processing++] & 0xff;
378 if(targa_header->bpp == 32)
379 a = data[current_processing++];
383 if(cur_x >= targa_header->w) {
393 cur_y * targa_header->w + cur_x
408 qemu_log(
"Error: Mode not implemented: %d\n", targa_header->image_type);
Основные определения ядра
size_t filesize(const char *Path)
[FileIO] Возвращает размер указанного файла
ssize_t fseek(FILE *stream, ssize_t offset, uint8_t whence)
Установка позиции в потоке данных относительно текущей позиции
void fclose(FILE *stream)
Закончить работу с файлом
FILE * fopen(const char *filename, const char *_mode)
Открывает файл
int ftell(FILE *stream)
Текущая позиция считывания в файле
int fread(FILE *stream, size_t count, size_t size, void *buffer)
Чтение файла
Структура файла. Требуется для работы с VFS.