peter1138@2847: /* $Id$ */ bjarni@2736: bjarni@2736: #include "../../stdafx.h" bjarni@2736: #include "../../openttd.h" bjarni@2736: #include "../../variables.h" bjarni@2736: #include "../../macros.h" bjarni@2736: #include "../../debug.h" bjarni@2736: #include "../../functions.h" bjarni@2736: #include "../../gfx.h" bjarni@2736: #include "../../fileio.h" bjarni@2736: bjarni@2736: #include "splash.h" bjarni@2736: bjarni@2736: #ifdef WITH_PNG bjarni@2736: bjarni@2736: #include bjarni@2736: bjarni@2736: static void PNGAPI png_my_error(png_structp png_ptr, png_const_charp message) bjarni@2736: { Darkvater@5388: DEBUG(misc, 0, "[libpng] error: %s - %s", message, (char *)png_get_error_ptr(png_ptr)); bjarni@2736: longjmp(png_ptr->jmpbuf, 1); bjarni@2736: } bjarni@2736: bjarni@2736: static void PNGAPI png_my_warning(png_structp png_ptr, png_const_charp message) bjarni@2736: { Darkvater@5388: DEBUG(misc, 1, "[libpng] warning: %s - %s", message, (char *)png_get_error_ptr(png_ptr)); bjarni@2736: } bjarni@2736: bjarni@2736: void DisplaySplashImage(void) bjarni@2736: { bjarni@2736: png_byte header[8]; bjarni@2736: FILE *f; bjarni@2736: png_structp png_ptr; bjarni@2736: png_infop info_ptr, end_info; bjarni@2736: uint width, height, bit_depth, color_type; bjarni@2736: png_colorp palette; bjarni@2736: int num_palette; bjarni@2736: png_bytep *row_pointers; bjarni@2736: uint8 *src, *dst; bjarni@2736: uint y; bjarni@2736: uint xoff, yoff; bjarni@2736: int i; bjarni@2736: bjarni@2736: f = FioFOpenFile(SPLASH_IMAGE_FILE); bjarni@2736: if (f == NULL) return; bjarni@2736: bjarni@2736: fread(header, 1, 8, f); bjarni@2736: if (png_sig_cmp(header, 0, 8) != 0) { bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: bjarni@2736: png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, png_my_error, png_my_warning); bjarni@2736: bjarni@2736: if (png_ptr == NULL) { bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: bjarni@2736: info_ptr = png_create_info_struct(png_ptr); bjarni@2736: if (info_ptr == NULL) { bjarni@2736: png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: bjarni@2736: end_info = png_create_info_struct(png_ptr); bjarni@2736: if (end_info == NULL) { bjarni@2736: png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: bjarni@2736: if (setjmp(png_jmpbuf(png_ptr))) { bjarni@2736: png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: bjarni@2736: png_init_io(png_ptr, f); bjarni@2736: png_set_sig_bytes(png_ptr, 8); bjarni@2736: bjarni@2736: png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); bjarni@2736: bjarni@2736: width = png_get_image_width(png_ptr, info_ptr); bjarni@2736: height = png_get_image_height(png_ptr, info_ptr); bjarni@2736: bit_depth = png_get_bit_depth(png_ptr, info_ptr); bjarni@2736: color_type = png_get_color_type(png_ptr, info_ptr); bjarni@2736: peter1138@2953: if (color_type != PNG_COLOR_TYPE_PALETTE || bit_depth != 8) { bjarni@2736: png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: peter1138@2953: if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)) { bjarni@2736: png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: bjarni@2736: png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); bjarni@2736: bjarni@2736: row_pointers = png_get_rows(png_ptr, info_ptr); bjarni@2736: bjarni@2736: memset(_screen.dst_ptr, 0xff, _screen.pitch * _screen.height); bjarni@2736: peter1138@2953: if (width > (uint) _screen.width) width = _screen.width; peter1138@2953: if (height > (uint) _screen.height) height = _screen.height; bjarni@2736: bjarni@2736: xoff = (_screen.width - width) / 2; bjarni@2736: yoff = (_screen.height - height) / 2; peter1138@2953: for (y = 0; y < height; y++) { bjarni@2736: src = row_pointers[y]; bjarni@2736: dst = ((uint8 *) _screen.dst_ptr) + (yoff + y) * _screen.pitch + xoff; bjarni@2736: bjarni@2736: memcpy(dst, src, width); bjarni@2736: } bjarni@2736: bjarni@2736: for (i = 0; i < num_palette; i++) { bjarni@2736: _cur_palette[i].r = palette[i].red; bjarni@2736: _cur_palette[i].g = palette[i].green; bjarni@2736: _cur_palette[i].b = palette[i].blue; bjarni@2736: } bjarni@2736: bjarni@2736: _cur_palette[0xff].r = 0; bjarni@2736: _cur_palette[0xff].g = 0; bjarni@2736: _cur_palette[0xff].b = 0; bjarni@2736: bjarni@2736: _pal_first_dirty = 0; bjarni@2736: _pal_last_dirty = 0xff; bjarni@2736: bjarni@2736: png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); bjarni@2736: fclose(f); bjarni@2736: return; bjarni@2736: } bjarni@2736: bjarni@2736: bjarni@2736: truelight@4300: #else /* WITH_PNG */ bjarni@2736: bjarni@2736: void DisplaySplashImage(void) {} bjarni@2736: truelight@4300: #endif /* WITH_PNG */