12 #include "../../stdafx.h" 13 #include "../../openttd.h" 14 #include "../../debug.h" 15 #include "../../gfx_func.h" 16 #include "../../fileio_func.h" 17 #include "../../blitter/factory.hpp" 18 #include "../../core/mem_func.hpp" 26 #include "../../safeguards.h" 34 static void PNGAPI
png_my_error(png_structp png_ptr, png_const_charp message)
36 DEBUG(misc, 0,
"[libpng] error: %s - %s", message, (
char *)png_get_error_ptr(png_ptr));
37 longjmp(png_jmpbuf(png_ptr), 1);
46 static void PNGAPI
png_my_warning(png_structp png_ptr, png_const_charp message)
48 DEBUG(misc, 1,
"[libpng] warning: %s - %s", message, (
char *)png_get_error_ptr(png_ptr));
57 if (f == NULL)
return;
60 fread(header,
sizeof(png_byte), 8, f);
61 if (png_sig_cmp(header, 0, 8) != 0) {
68 if (png_ptr == NULL) {
73 png_infop info_ptr = png_create_info_struct(png_ptr);
74 if (info_ptr == NULL) {
75 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
80 png_infop end_info = png_create_info_struct(png_ptr);
81 if (end_info == NULL) {
82 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
87 if (setjmp(png_jmpbuf(png_ptr))) {
88 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
93 png_init_io(png_ptr, f);
94 png_set_sig_bytes(png_ptr, 8);
96 png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
98 uint width = png_get_image_width(png_ptr, info_ptr);
99 uint height = png_get_image_height(png_ptr, info_ptr);
100 uint bit_depth = png_get_bit_depth(png_ptr, info_ptr);
101 uint color_type = png_get_color_type(png_ptr, info_ptr);
103 if (color_type != PNG_COLOR_TYPE_PALETTE || bit_depth != 8) {
104 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
109 if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)) {
110 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
117 png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
119 png_bytep *row_pointers = png_get_rows(png_ptr, info_ptr);
121 if (width > (uint) _screen.width) width = _screen.width;
122 if (height > (uint) _screen.height) height = _screen.height;
124 uint xoff = (_screen.width - width) / 2;
125 uint yoff = (_screen.height - height) / 2;
129 uint8 *dst_ptr = (uint8 *)_screen.dst_ptr;
131 MemSetT(dst_ptr, 0xff, _screen.pitch * _screen.height);
133 for (uint y = 0; y < height; y++) {
134 uint8 *src = row_pointers[y];
135 uint8 *dst = dst_ptr + (yoff + y) * _screen.pitch + xoff;
137 memcpy(dst, src, width);
140 for (
int i = 0; i < num_palette; i++) {
157 uint32 *dst_ptr = (uint32 *)_screen.dst_ptr;
159 MemSetT(dst_ptr, 0, _screen.pitch * _screen.height);
161 for (uint y = 0; y < height; y++) {
162 uint8 *src = row_pointers[y];
163 uint32 *dst = dst_ptr + (yoff + y) * _screen.pitch + xoff;
165 for (uint x = 0; x < width; x++) {
166 dst[x] = palette[src[x]].blue | (palette[src[x]].green << 8) | (palette[src[x]].red << 16) | 0xff000000;
173 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
static void PNGAPI png_my_warning(png_structp png_ptr, png_const_charp message)
Handle warning in pnglib.
Colour palette[256]
Current palette. Entry 0 has to be always fully transparent!
Functions to support splash screens for OSX.
uint8 a
colour channels in LE order
void DisplaySplashImage()
Display a splash image shown on startup (WITH_PNG).
static void PNGAPI png_my_error(png_structp png_ptr, png_const_charp message)
Handle pnglib error.
Subdirectory for all base data (base sets, intro game)
FILE * FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir, size_t *filesize)
Opens a OpenTTD file somewhere in a personal or global directory.
static Blitter * GetCurrentBlitter()
Get the current active blitter (always set by calling SelectBlitter).
int first_dirty
The first dirty element.
Palette _cur_palette
Current palette.
#define DEBUG(name, level,...)
Output a line of debugging information.
virtual uint8 GetScreenDepth()=0
Get the screen depth this blitter works for.
int count_dirty
The number of dirty elements.
static void MemSetT(T *ptr, byte value, size_t num=1)
Type-safe version of memset().