Koraidon

Форк
0
/
tga_image.c 
90 строк · 1.8 Кб
1
#include <stdlib.h>
2

3
#include "video/tga_image.h"
4
#include "video/pixel.h"
5
#include "video/scaler.h"
6
#include "video/blit.h"
7
#include "video/pixfmt_conv.h"
8

9
int tga_draw(koraidon_backfb_t framebuffer, size_t x, size_t y, const char* filename) {
10
	tga_header_t* tga_header = calloc(1, sizeof(tga_header_t));
11

12
	if(!tga_header) {
13
		return -1;
14
	}
15

16
	bool ok = tga_extract_info(filename, tga_header);
17

18
	if(ok) {
19
		size_t buffer_size = tga_header->w * tga_header->h;
20
		uint32_t* image_data = calloc(buffer_size, 4);
21

22
		int errcode = tga_extract_pixels(filename, image_data);
23

24
		if(errcode < 0) {
25
			free(tga_header);
26

27
			return errcode;
28
		}
29

30
		for(size_t sy = 0; sy < tga_header->h; sy++) {
31
			for(size_t sx = 0; sx < tga_header->w; sx++) {
32
				set_pixel(framebuffer, x + sx, y + sy, image_data[(sy * tga_header->w + sx)]);
33
			}
34
		}
35

36
		free(image_data);
37

38
		return 0;
39
	}
40

41
	free(tga_header);
42
	return -1;
43
}
44

45
// WARNING: Not a fast function.
46
int tga_scale_draw(koraidon_backfb_t framebuffer, size_t x, size_t y, size_t width, size_t height, const char* filename) {
47
	tga_header_t* tga_header = calloc(1, sizeof(tga_header_t));
48

49
	if(!tga_header) {
50
		return -1;
51
	}
52

53
	bool ok = tga_extract_info(filename, tga_header);
54

55
	if(ok) {
56
		size_t buffer_size = tga_header->w * tga_header->h;
57
		uint32_t* image_data = calloc(buffer_size, 4); // 4 byte is 32 bit (which ARGB pixel format)
58

59
		int errcode = tga_extract_pixels(filename, image_data);
60

61
		if(errcode < 0) {
62
			free(tga_header);
63

64
			return errcode;
65
		}
66

67
		uint32_t* out_data = 0;
68

69
		scaler_scale(
70
			(char*)image_data,
71
			32,
72
			tga_header->w, tga_header->h,
73
			width, height,
74
			(char**)&out_data
75
	 	);
76

77
		pixfmt_conv((char*)out_data, 32, width, height, SCREEN_RGB, framebuffer.screen.pixfmt);
78

79
		buffer_blit(framebuffer, (char*)out_data, 32, x, y, width, height);
80

81
		free(image_data);
82
		free(out_data);
83

84
		return 0;
85
	}
86

87
	free(tga_header);
88

89
	return -1;
90
}
91

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.