mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-18 20:19:11 +00:00
(svn r3281) -Feature: [OSX] added native cocoa sound and video drivers (egladil)
you can still use SDL drivers if you like and you have to run "make upgradeconf" to start using the cocoa drivers (or manually write WITH_COCOA:=1) since SDL breaks the cocoa drivers, you can't compile with both SDL and cocoa support Using cocoa drivers makes it easier to make universal binaries and it solves: -FS#18 [OSX] SDL is weird in universal binaries -FS#2 [OSX] lazy pointer crash on exit -FS#10 [OSX] linking error when linking statically to SDL 1.2.8 (needless to explain this, but it means it should be able to compile statically with the default settings now) -[ 1215073 ] Switching to large size out of fullscreen crashes Using SDL drivers will still have those issues though
This commit is contained in:
@@ -45,6 +45,7 @@ $(BUILD_OSX_BUNDLE): $(TTD) $(FAT_BINARY)
|
||||
$(Q)cp os/macosx/openttd.icns "$(OSXAPP)"/Contents/Resources/openttd.icns
|
||||
$(Q)os/macosx/plistgen.sh "$(OSXAPP)" "$(REV)"
|
||||
$(Q)cp data/* "$(OSXAPP)"/Contents/Data/
|
||||
$(Q)cp os/macosx/splash.png "$(OSXAPP)"/Contents/Data/
|
||||
$(Q)cp lang/*.lng "$(OSXAPP)"/Contents/Lang/
|
||||
$(Q)cp $(TTD) "$(OSXAPP)"/Contents/MacOS/$(TTD)
|
||||
$(COPY_x86_SDL_LIB)
|
||||
|
@@ -15,12 +15,12 @@ void ShowMacDialog ( const char *title, const char *message, const char *buttonL
|
||||
|
||||
void ShowMacAssertDialog ( const char *function, const char *file, const int line, const char *expression )
|
||||
{
|
||||
const char *buffer =
|
||||
const char *buffer =
|
||||
[[NSString stringWithFormat:@"An assertion has failed and OpenTTD must quit.\n%s in %s (line %d)\n\"%s\"\n\nYou should report this error the OpenTTD developers if you think you found a bug.",
|
||||
function, file, line, expression] cStringUsingEncoding:NSASCIIStringEncoding];
|
||||
NSLog(@"%s", buffer);
|
||||
ShowMacDialog( "Assertion Failed", buffer, "Quit" );
|
||||
|
||||
|
||||
// abort so that a debugger has a chance to notice
|
||||
abort();
|
||||
}
|
||||
|
145
os/macosx/splash.c
Normal file
145
os/macosx/splash.c
Normal file
@@ -0,0 +1,145 @@
|
||||
|
||||
#include "../../stdafx.h"
|
||||
#include "../../openttd.h"
|
||||
#include "../../variables.h"
|
||||
#include "../../macros.h"
|
||||
#include "../../debug.h"
|
||||
#include "../../functions.h"
|
||||
#include "../../gfx.h"
|
||||
#include "../../fileio.h"
|
||||
|
||||
#include "splash.h"
|
||||
|
||||
#ifdef WITH_PNG
|
||||
|
||||
#include <png.h>
|
||||
|
||||
static void PNGAPI png_my_error(png_structp png_ptr, png_const_charp message)
|
||||
{
|
||||
DEBUG(misc, 0) ("ERROR(libpng): %s - %s", message, (char *)png_get_error_ptr(png_ptr));
|
||||
longjmp(png_ptr->jmpbuf, 1);
|
||||
}
|
||||
|
||||
static void PNGAPI png_my_warning(png_structp png_ptr, png_const_charp message)
|
||||
{
|
||||
DEBUG(misc, 0) ("WARNING(libpng): %s - %s", message, (char *)png_get_error_ptr(png_ptr));
|
||||
}
|
||||
|
||||
void DisplaySplashImage(void)
|
||||
{
|
||||
png_byte header[8];
|
||||
FILE *f;
|
||||
png_structp png_ptr;
|
||||
png_infop info_ptr, end_info;
|
||||
uint width, height, bit_depth, color_type;
|
||||
png_colorp palette;
|
||||
int num_palette;
|
||||
png_bytep *row_pointers;
|
||||
uint8 *src, *dst;
|
||||
uint y;
|
||||
uint xoff, yoff;
|
||||
int i;
|
||||
|
||||
f = FioFOpenFile(SPLASH_IMAGE_FILE);
|
||||
if (f == NULL) return;
|
||||
|
||||
fread(header, 1, 8, f);
|
||||
if (png_sig_cmp(header, 0, 8) != 0) {
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, png_my_error, png_my_warning);
|
||||
|
||||
if (png_ptr == NULL) {
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
info_ptr = png_create_info_struct(png_ptr);
|
||||
if (info_ptr == NULL) {
|
||||
png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
end_info = png_create_info_struct(png_ptr);
|
||||
if (end_info == NULL) {
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
if (setjmp(png_jmpbuf(png_ptr))) {
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
png_init_io(png_ptr, f);
|
||||
png_set_sig_bytes(png_ptr, 8);
|
||||
|
||||
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
|
||||
|
||||
width = png_get_image_width(png_ptr, info_ptr);
|
||||
height = png_get_image_height(png_ptr, info_ptr);
|
||||
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
|
||||
color_type = png_get_color_type(png_ptr, info_ptr);
|
||||
|
||||
if(color_type != PNG_COLOR_TYPE_PALETTE || bit_depth != 8) {
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)) {
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
|
||||
|
||||
row_pointers = png_get_rows(png_ptr, info_ptr);
|
||||
|
||||
memset(_screen.dst_ptr, 0xff, _screen.pitch * _screen.height);
|
||||
|
||||
if(width > (uint) _screen.width)
|
||||
width = _screen.width;
|
||||
if(height > (uint) _screen.height)
|
||||
height = _screen.height;
|
||||
|
||||
xoff = (_screen.width - width) / 2;
|
||||
yoff = (_screen.height - height) / 2;
|
||||
for(y = 0; y < height; y++) {
|
||||
src = row_pointers[y];
|
||||
dst = ((uint8 *) _screen.dst_ptr) + (yoff + y) * _screen.pitch + xoff;
|
||||
|
||||
memcpy(dst, src, width);
|
||||
}
|
||||
|
||||
for (i = 0; i < num_palette; i++) {
|
||||
_cur_palette[i].r = palette[i].red;
|
||||
_cur_palette[i].g = palette[i].green;
|
||||
_cur_palette[i].b = palette[i].blue;
|
||||
}
|
||||
|
||||
_cur_palette[0xff].r = 0;
|
||||
_cur_palette[0xff].g = 0;
|
||||
_cur_palette[0xff].b = 0;
|
||||
|
||||
_pal_first_dirty = 0;
|
||||
_pal_last_dirty = 0xff;
|
||||
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
||||
fclose(f);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#else // WITH_PNG
|
||||
|
||||
void DisplaySplashImage(void) {}
|
||||
|
||||
#endif // WITH_PNG
|
9
os/macosx/splash.h
Normal file
9
os/macosx/splash.h
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
#ifndef SPLASH_H
|
||||
#define SPLASH_H
|
||||
|
||||
#define SPLASH_IMAGE_FILE "splash.png"
|
||||
|
||||
void DisplaySplashImage(void);
|
||||
|
||||
#endif
|
BIN
os/macosx/splash.png
Normal file
BIN
os/macosx/splash.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
Reference in New Issue
Block a user