diff --git a/CMakeLists.txt b/CMakeLists.txt index 46ae9a0c3..c050cc8c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,3 +5,7 @@ SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/mk/cmake/Modules) ADD_SUBDIRECTORY( source/shared_lib ) ADD_SUBDIRECTORY( source/glest_game ) + +IF(APPLE) + include(mk/macosx/CMakeLists.txt) +ENDIF(APPLE) diff --git a/mk/cmake/Modules/FindLUA.cmake b/mk/cmake/Modules/FindLUA.cmake index a31921a68..245b12a9d 100644 --- a/mk/cmake/Modules/FindLUA.cmake +++ b/mk/cmake/Modules/FindLUA.cmake @@ -20,9 +20,11 @@ FIND_PATH(LUA_INCLUDE_DIR NAMES lua.hpp PATHS /usr/include /usr/include/lua /usr/include/lua5.1 + $ENV{LUA_HOME} ) -FIND_LIBRARY(LUA_LIBRARIES NAMES lua5.1 lua ) +FIND_LIBRARY(LUA_LIBRARIES NAMES lua5.1 lua + PATHS $ENV{LUA_HOME}) IF(LUA_INCLUDE_DIR AND LUA_LIBRARIES) SET(LUA_FOUND TRUE) diff --git a/mk/cmake/Modules/FindOGG.cmake b/mk/cmake/Modules/FindOGG.cmake index 837aff18c..00ae6ec89 100644 --- a/mk/cmake/Modules/FindOGG.cmake +++ b/mk/cmake/Modules/FindOGG.cmake @@ -15,9 +15,13 @@ ENDIF(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY) FIND_PATH(OGG_INCLUDE_DIR ogg/ogg.h) FIND_LIBRARY(OGG_LIBRARY NAMES ogg) FIND_LIBRARY(VORBIS_LIBRARY NAMES vorbis) -FIND_LIBRARY(VORBIS_FILE_LIBRARY NAMES vorbisfile) -IF(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND VORBIS_FILE_LIBRARY) +#on macosx the vorbisfile library is part of the vorbisone... +IF(NOT APPLE) + FIND_LIBRARY(VORBIS_FILE_LIBRARY NAMES vorbisfile) +ENDIF(NOT APPLE) + +IF(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND (APPLE OR VORBIS_FILE_LIBRARY)) SET(OGG_FOUND TRUE) IF(NOT OGG_BE_QUIET) MESSAGE(STATUS "OGG/Vorbis includes: ${OGG_INCLUDE_DIR}") @@ -25,10 +29,10 @@ IF(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND VORBIS_FILE_LIBRARY) MESSAGE(STATUS "Vorbis library : ${VORBIS_LIBRARY}") MESSAGE(STATUS "Vorbis file library: ${VORBIS_FILE_LIBRARY}") ENDIF(NOT OGG_BE_QUIET) -ELSE(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND VORBIS_FILE_LIBRARY) +ELSE(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND (APPLE OR VORBIS_FILE_LIBRARY)) SET(OGG_FOUND FALSE) MESSAGE("OGG/Vorbis was not found on this system!") -ENDIF(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND VORBIS_FILE_LIBRARY) +ENDIF(OGG_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND (APPLE OR VORBIS_FILE_LIBRARY)) MARK_AS_ADVANCED( OGG_INCLUDE_DIR diff --git a/mk/cmake/Modules/FindXercesC.cmake b/mk/cmake/Modules/FindXercesC.cmake index 631c5863c..93914a986 100644 --- a/mk/cmake/Modules/FindXercesC.cmake +++ b/mk/cmake/Modules/FindXercesC.cmake @@ -11,9 +11,10 @@ IF (XERCESC_INCLUDE_DIR) SET(XERCESC_FIND_QUIETLY TRUE) ENDIF (XERCESC_INCLUDE_DIR) -FIND_PATH(XERCESC_INCLUDE_DIR xercesc/dom/DOM.hpp) +FIND_PATH(XERCESC_INCLUDE_DIR xercesc + PATH_SUFFIXES DOM/dom.hpp) -SET(XERCESC_NAMES xerces-c xerces-c_3 xerces-c_2) +SET(XERCESC_NAMES xerces-c xerces-c_3 xerces-c_2 Xerces) FIND_LIBRARY(XERCESC_LIBRARY NAMES ${XERCESC_NAMES} ) # Handle the QUIETLY and REQUIRED arguments and set XERCESC_FOUND to diff --git a/mk/linux/Jamfile b/mk/linux/Jamfile index 089c47ab3..0bd1e8f24 100644 --- a/mk/linux/Jamfile +++ b/mk/linux/Jamfile @@ -51,6 +51,7 @@ LIB_DIRS = platform/common platform/sdl platform/posix + platform/unix util graphics graphics/gl diff --git a/mk/macosx/CMakeLists.txt b/mk/macosx/CMakeLists.txt new file mode 100644 index 000000000..57cceff62 --- /dev/null +++ b/mk/macosx/CMakeLists.txt @@ -0,0 +1,168 @@ +# Set defaults for Universal Binaries. We want 32-bit Intel/PPC on 10.4 +# and 32/64-bit Intel/PPC on >= 10.5. Anything <= 10.3 doesn't support. +# These are just defaults/recommendations, but how we want to build +# out of the box. But the user needs to be able to change these options. +# So we must only set the values the first time CMake is run, or we +# will overwrite any changes the user sets. +# FORCE is used because the options are not reflected in the UI otherwise. +# Seems like a good place to add version specific compiler flags too. +IF(NOT CONFIG_HAS_BEEN_RUN_BEFORE) + IF(EXISTS /Developer/SDKs/MacOSX10.6.sdk) + SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.6 -ftree-vectorize -fvisibility-inlines-hidden" CACHE STRING "Flags used by the compiler during all build types." FORCE) + + ELSEIF(EXISTS /Developer/SDKs/MacOSX10.5.sdk) + # 64-bit compiles are not supported with Carbon. We should enable + # 64-bit compilation by default once osgviewer has been + # rewritten with Cocoa. + #SET(CMAKE_OSX_ARCHITECTURES "ppc;i386;ppc64;x86_64" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.5 -ftree-vectorize -fvisibility-inlines-hidden" CACHE STRING "Flags used by the compiler during all build types." FORCE) + ELSE() + # No Universal Binary support + # Should break down further to set the -mmacosx-version-min, + # but the SDK detection is too unreliable here. + ENDIF() +ENDIF(NOT CONFIG_HAS_BEEN_RUN_BEFORE) + + + +##install part + + + +include (InstallRequiredSystemLibraries) + +set (CPACK_RESOURCE_FILE_LICENSE + "${CMAKE_CURRENT_SOURCE_DIR}/docs/code_license.txt") +set (CPACK_GENERATOR Bundle) +set (CPACK_BUNDLE_NAME "MegaGlest") +set (CPACK_BUNDLE_STARTUP_COMMAND "${PROJECT_SOURCE_DIR}/data/glest_game/Debug/glest.bin") +set (CPACK_BUNDLE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/MegaGlest.icns") +set (CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/MegaGlest.icns") +set (CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/Info.plist") +INSTALL(FILES + ${LUA_LIBRARIES} + DESTINATION ../Frameworks + ) +INSTALL(DIRECTORY + ${OGG_LIBRARY} + ${XERCESC_LIBRARY} + ${VORBIS_LIBRARY} + ${SDL_LIBRARY} + DESTINATION ../Frameworks + ) + +include (CPack) +# Set defaults for Universal Binaries. We want 32-bit Intel/PPC on 10.4 +# and 32/64-bit Intel/PPC on >= 10.5. Anything <= 10.3 doesn't support. +# These are just defaults/recommendations, but how we want to build +# out of the box. But the user needs to be able to change these options. +# So we must only set the values the first time CMake is run, or we +# will overwrite any changes the user sets. +# FORCE is used because the options are not reflected in the UI otherwise. +# Seems like a good place to add version specific compiler flags too. +IF(NOT CONFIG_HAS_BEEN_RUN_BEFORE) + IF(EXISTS /Developer/SDKs/MacOSX10.6.sdk) + SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.6 -ftree-vectorize -fvisibility-inlines-hidden" CACHE STRING "Flags used by the compiler during all build types." FORCE) + + ELSEIF(EXISTS /Developer/SDKs/MacOSX10.5.sdk) + # 64-bit compiles are not supported with Carbon. We should enable + # 64-bit compilation by default once osgviewer has been + # rewritten with Cocoa. + #SET(CMAKE_OSX_ARCHITECTURES "ppc;i386;ppc64;x86_64" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.5 -ftree-vectorize -fvisibility-inlines-hidden" CACHE STRING "Flags used by the compiler during all build types." FORCE) + ELSE() + # No Universal Binary support + # Should break down further to set the -mmacosx-version-min, + # but the SDK detection is too unreliable here. + ENDIF() +ENDIF(NOT CONFIG_HAS_BEEN_RUN_BEFORE) + + + +##install part + + + +include (InstallRequiredSystemLibraries) + +set (CPACK_RESOURCE_FILE_LICENSE + "${CMAKE_CURRENT_SOURCE_DIR}/docs/code_license.txt") +set (CPACK_GENERATOR Bundle) +set (CPACK_BUNDLE_NAME "MegaGlest") +set (CPACK_BUNDLE_STARTUP_COMMAND "${PROJECT_SOURCE_DIR}/data/glest_game/Debug/glest.bin") +set (CPACK_BUNDLE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/MegaGlest.icns") +set (CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/MegaGlest.icns") +set (CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/Info.plist") +INSTALL(FILES + ${LUA_LIBRARIES} + DESTINATION ../Frameworks + ) +INSTALL(DIRECTORY + ${OGG_LIBRARY} + ${XERCESC_LIBRARY} + ${VORBIS_LIBRARY} + ${SDL_LIBRARY} + DESTINATION ../Frameworks + ) + +include (CPack) +# Set defaults for Universal Binaries. We want 32-bit Intel/PPC on 10.4 +# and 32/64-bit Intel/PPC on >= 10.5. Anything <= 10.3 doesn't support. +# These are just defaults/recommendations, but how we want to build +# out of the box. But the user needs to be able to change these options. +# So we must only set the values the first time CMake is run, or we +# will overwrite any changes the user sets. +# FORCE is used because the options are not reflected in the UI otherwise. +# Seems like a good place to add version specific compiler flags too. +IF(NOT CONFIG_HAS_BEEN_RUN_BEFORE) + IF(EXISTS /Developer/SDKs/MacOSX10.6.sdk) + SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.6 -ftree-vectorize -fvisibility-inlines-hidden" CACHE STRING "Flags used by the compiler during all build types." FORCE) + + ELSEIF(EXISTS /Developer/SDKs/MacOSX10.5.sdk) + # 64-bit compiles are not supported with Carbon. We should enable + # 64-bit compilation by default once osgviewer has been + # rewritten with Cocoa. + #SET(CMAKE_OSX_ARCHITECTURES "ppc;i386;ppc64;x86_64" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for OSX" FORCE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.5 -ftree-vectorize -fvisibility-inlines-hidden" CACHE STRING "Flags used by the compiler during all build types." FORCE) + ELSE() + # No Universal Binary support + # Should break down further to set the -mmacosx-version-min, + # but the SDK detection is too unreliable here. + ENDIF() +ENDIF(NOT CONFIG_HAS_BEEN_RUN_BEFORE) + + + +##install part + + + +include (InstallRequiredSystemLibraries) + +set (CPACK_RESOURCE_FILE_LICENSE + "${CMAKE_CURRENT_SOURCE_DIR}/docs/code_license.txt") +set (CPACK_GENERATOR Bundle) +set (CPACK_BUNDLE_NAME "MegaGlest") +set (CPACK_BUNDLE_STARTUP_COMMAND "${PROJECT_SOURCE_DIR}/data/glest_game/Debug/glest.bin") +set (CPACK_BUNDLE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/MegaGlest.icns") +set (CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/MegaGlest.icns") +set (CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/mk/macosx/Info.plist") +INSTALL(FILES + ${LUA_LIBRARIES} + DESTINATION ../Frameworks + ) +INSTALL(DIRECTORY + ${OGG_LIBRARY} + ${XERCESC_LIBRARY} + ${VORBIS_LIBRARY} + ${SDL_LIBRARY} + DESTINATION ../Frameworks + ) + +include (CPack) diff --git a/mk/macosx/Info.plist b/mk/macosx/Info.plist new file mode 100644 index 000000000..975f8feae --- /dev/null +++ b/mk/macosx/Info.plist @@ -0,0 +1,96 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + MegaGlest + CFBundleGetInfoString + 3.2.2r1, © 2001-2009 The Glest Team All Rights Reserved. + CFBundleIconFile + MegaGlest + CFBundleIdentifier + jp.ne.ivory.ciderhouse.MegaGlest + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + MegaGlest + CFBundlePackageType + APPL + CFBundleShortVersionString + 3.2.2 + CFBundleSignature + ???? + CFBundleVersion + 3.2 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + MegaGlest + CFBundleGetInfoString + 3.2.2r1, © 2001-2009 The Glest Team All Rights Reserved. + CFBundleIconFile + MegaGlest + CFBundleIdentifier + jp.ne.ivory.ciderhouse.MegaGlest + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + MegaGlest + CFBundlePackageType + APPL + CFBundleShortVersionString + 3.2.2 + CFBundleSignature + ???? + CFBundleVersion + 3.2 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + MegaGlest + CFBundleGetInfoString + 3.2.2r1, © 2001-2009 The Glest Team All Rights Reserved. + CFBundleIconFile + MegaGlest + CFBundleIdentifier + jp.ne.ivory.ciderhouse.MegaGlest + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + MegaGlest + CFBundlePackageType + APPL + CFBundleShortVersionString + 3.2.2 + CFBundleSignature + ???? + CFBundleVersion + 3.2 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mk/macosx/MegaGlest.icns b/mk/macosx/MegaGlest.icns new file mode 100644 index 000000000..c95a57a7f Binary files /dev/null and b/mk/macosx/MegaGlest.icns differ diff --git a/source/glest_game/CMakeLists.txt b/source/glest_game/CMakeLists.txt index 6f4eacb62..d4f0e42be 100644 --- a/source/glest_game/CMakeLists.txt +++ b/source/glest_game/CMakeLists.txt @@ -54,6 +54,7 @@ SET(DIRS_WITH_SRC type_instances types world) + SET(GLEST_LIB_INCLUDE_ROOT "../shared_lib/include/") SET(GLEST_LIB_INCLUDE_DIRS @@ -69,7 +70,8 @@ SET(GLEST_LIB_INCLUDE_DIRS ${GLEST_LIB_INCLUDE_ROOT}glew ${GLEST_LIB_INCLUDE_ROOT}lua ${GLEST_LIB_INCLUDE_ROOT}streflop - ${GLEST_LIB_INCLUDE_ROOT}streflop/libm_flt32_source) + ${GLEST_LIB_INCLUDE_ROOT}streflop/libm_flt32_source + ${GLEST_LIB_INCLUDE_ROOT}map) INCLUDE_DIRECTORIES( ${GLEST_LIB_INCLUDE_DIRS} ) SET(MG_SOURCE_FILES "") @@ -80,10 +82,19 @@ FOREACH(DIR IN LISTS DIRS_WITH_SRC) set(SRC_DIR_TO_GLOB ${DIR}) FILE(GLOB SRC_FILES_FROM_THIS_DIR ${SRC_DIR_TO_GLOB}/*.cpp) SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${SRC_FILES_FROM_THIS_DIR}) + + IF(APPLE) + FILE(GLOB SRC_FILES_FROM_THIS_DIR ${SRC_DIR_TO_GLOB}/*.mm) + #MESSAGE(STATUS "SRC_FILES_FROM_THIS_DIR: ${SRC_FILES_FROM_THIS_DIR}") + SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${SRC_FILES_FROM_THIS_DIR}) + FILE(GLOB SRC_FILES_FROM_THIS_DIR ${SRC_DIR_TO_GLOB}/*.m) + #MESSAGE(STATUS "SRC_FILES_FROM_THIS_DIR: ${SRC_FILES_FROM_THIS_DIR}") + SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${SRC_FILES_FROM_THIS_DIR}) + ENDIF(APPLE) ENDFOREACH(DIR) # [RCL] FIXME: make it compiler-agnostic -SET(CMAKE_CXX_FLAGS "-O3 -msse -msse2 -mfpmath=sse -DSTREFLOP_SSE") +SET(CMAKE_CXX_FLAGS "-O3 -fno-strict-aliasing -frounding-math -fsignaling-nans -mfpmath=sse -msse -DSTREFLOP_SSE") SET(TARGET_NAME "glest.bin") diff --git a/source/shared_lib/CMakeLists.txt b/source/shared_lib/CMakeLists.txt index f1d9dca5a..e3c126f5f 100644 --- a/source/shared_lib/CMakeLists.txt +++ b/source/shared_lib/CMakeLists.txt @@ -47,6 +47,7 @@ FIND_PACKAGE(CURL REQUIRED) INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS}) SET(EXTERNAL_LIBS ${EXTERNAL_LIBS} ${CURL_LIBRARIES}) + ######################################################################################### # glest lib @@ -63,7 +64,14 @@ SET(DIRS_WITH_SRC glew lua streflop - streflop/libm_flt32_source) + streflop/libm_flt32_source + map) + +IF(APPLE) + SET(DIRS_WITH_SRC ${DIRS_WITH_SRC} platform/macosx) +ELSE(APPLE) + SET(DIRS_WITH_SRC ${DIRS_WITH_SRC} platform/unix) +ENDIF(APPLE) SET(MG_INCLUDES_ROOT "include/") SET(MG_SOURCES_ROOT "sources/") @@ -73,35 +81,55 @@ SET(MG_SOURCE_FILES "") FOREACH(DIR IN LISTS DIRS_WITH_SRC) set(INCLUDE_DIR_TO_GLOB ${MG_INCLUDES_ROOT}${DIR}) INCLUDE_DIRECTORIES( ${INCLUDE_DIR_TO_GLOB} ) - #MESSAGE(STATUS "INCLUDE_DIR_TO_GLOB: ${INCLUDE_DIR_TO_GLOB}") - #FILE(GLOB INC_FILES_FROM_THIS_DIR ${INCLUDE_DIR_TO_GLOB}/*.h) - #MESSAGE(STATUS "INCLUDE FILES GLOBBED: ${INC_FILES_FROM_THIS_DIR}") - #SET(MG_INCLUDE_FILES ${MG_INCLUDE_FILES} ${INC_FILES_FROM_THIS_DIR}) + IF(APPLE) + #MESSAGE(STATUS "INCLUDE_DIR_TO_GLOB: ${INCLUDE_DIR_TO_GLOB}") + FILE(GLOB INC_FILES_FROM_THIS_DIR ${INCLUDE_DIR_TO_GLOB}/*.h) + #MESSAGE(STATUS "INCLUDE FILES GLOBBED: ${INC_FILES_FROM_THIS_DIR}") + SET(MG_INCLUDE_FILES ${MG_INCLUDE_FILES} ${INC_FILES_FROM_THIS_DIR}) + ENDIF(APPLE) set(SRC_DIR_TO_GLOB ${MG_SOURCES_ROOT}${DIR}) #MESSAGE(STATUS "SRC_DIR_TO_GLOB: ${SRC_DIR_TO_GLOB}") FILE(GLOB SRC_FILES_FROM_THIS_DIR ${SRC_DIR_TO_GLOB}/*.cpp) #MESSAGE(STATUS "SRC_FILES_FROM_THIS_DIR: ${SRC_FILES_FROM_THIS_DIR}") SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${SRC_FILES_FROM_THIS_DIR}) + + IF(APPLE) + FILE(GLOB SRC_FILES_FROM_THIS_DIR ${SRC_DIR_TO_GLOB}/*.mm) + #MESSAGE(STATUS "SRC_FILES_FROM_THIS_DIR: ${SRC_FILES_FROM_THIS_DIR}") + SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${SRC_FILES_FROM_THIS_DIR}) + FILE(GLOB SRC_FILES_FROM_THIS_DIR ${SRC_DIR_TO_GLOB}/*.m) + #MESSAGE(STATUS "SRC_FILES_FROM_THIS_DIR: ${SRC_FILES_FROM_THIS_DIR}") + SET(MG_SOURCE_FILES ${MG_SOURCE_FILES} ${SRC_FILES_FROM_THIS_DIR}) + ENDIF(APPLE) ENDFOREACH(DIR) + #MESSAGE(STATUS "Source files: ${MG_INCLUDE_FILES}") #MESSAGE(STATUS "Source files: ${MG_SOURCE_FILES}") #MESSAGE(STATUS "Include dirs: ${INCLUDE_DIRECTORIES}") # FIXME: hackish, should be tested for -SET(UNIX_SPECIFIC_DEFINES "-DX11_AVAILABLE -DHAVE_SYS_IOCTL_H") - +IF(APPLE) + SET(PLATFORM_SPECIFIC_DEFINES "-DHAVE_SYS_IOCTL_H") +ELSE(APPLE) + SET(PLATFORM_SPECIFIC_DEFINES "-DX11_AVAILABLE -DHAVE_SYS_IOCTL_H") +ENDIF(APPLE) # FIXME: hackish... SET(STREFLOP_PROPERTIES "-DSTREFLOP_SSE -DLIBM_COMPILING_FLT32") -# FIXME: should choose between platforms SET_SOURCE_FILES_PROPERTIES(${MG_SOURCE_FILES} PROPERTIES COMPILE_FLAGS - "${UNIX_SPECIFIC_DEFINES} ${STREFLOP_PROPERTIES} ${CXXFLAGS}") + "${PLATFORM_SPECIFIC_DEFINES} ${STREFLOP_PROPERTIES} ${CXXFLAGS}") + +SET_SOURCE_FILES_PROPERTIES(${MG_INCLUDE_FILES} PROPERTIES HEADER_FILE_ONLY 1) + # [RCL] FIXME: make it compiler-agnostic -SET(CMAKE_CXX_FLAGS "-O3 -msse -msse2 -mfpmath=sse") +SET(CMAKE_CXX_FLAGS "-O3 -fno-strict-aliasing -frounding-math -fsignaling-nans -mfpmath=sse -msse") ADD_LIBRARY(glest_lib ${MG_SOURCE_FILES}) TARGET_LINK_LIBRARIES(glest_lib streflop) TARGET_LINK_LIBRARIES(glest_lib ${EXTERNAL_LIBS}) + + + diff --git a/source/shared_lib/sources/platform/macosx/NSFont_OpenGL.h b/source/shared_lib/sources/platform/macosx/NSFont_OpenGL.h new file mode 100644 index 000000000..6646a3df2 --- /dev/null +++ b/source/shared_lib/sources/platform/macosx/NSFont_OpenGL.h @@ -0,0 +1,54 @@ +/* + * Addition to NSFont to allow easy OpenGL display list creation of bitmaps + * based on the receiver's font. Example usage: + * + * [ myFont makeGLDisplayListFirst:' ' count:95 base:displayListBase ]; + * + * This creates a set of display lists, starting at displayListBase, with 95 + * characters starting with the space. Returns TRUE if all went well, + * FALSE otherwise. + * + * By default, if any errors are encountered, NSLog() will be used to note + * what happened; use + * + * [ NSFont setOpenGLLogging:NO ]; + * + * to disable logging. + * + * This program is Copyright © 2002 Bryan L Blackburn. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the names Bryan L Blackburn, Withay.com, nor the names of any + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRYAN L BLACKBURN ``AS IS'' AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* NSFont_OpenGL.h */ + +#import +#import + +@interface NSFont (withay_OpenGL) + ++ (void) setOpenGLLogging:(BOOL)logEnabled; +- (BOOL) makeGLDisplayListFirst:(unichar)first count:(int)count base:(GLint)base; + +@end diff --git a/source/shared_lib/sources/platform/macosx/NSFont_OpenGL.m b/source/shared_lib/sources/platform/macosx/NSFont_OpenGL.m new file mode 100644 index 000000000..dd75a6e8c --- /dev/null +++ b/source/shared_lib/sources/platform/macosx/NSFont_OpenGL.m @@ -0,0 +1,211 @@ +/* + * This program is Copyright © 2002 Bryan L Blackburn. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the names Bryan L Blackburn, Withay.com, nor the names of any + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRYAN L BLACKBURN ``AS IS'' AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Initial version, 27 October, 2002 + */ + +/* NSFont_OpenGL.m */ + +#import "NSFont_OpenGL.h" + +@interface NSFont (withay_OpenGL_InternalMethods) +- (BOOL) makeDisplayList:(GLint)listNum withImage:(NSImage *)theImage; ++ (void) doOpenGLLog:(NSString *)format, ...; +@end + +@implementation NSFont (withay_OpenGL) + +static BOOL openGLLoggingEnabled = YES; + +/* + * Enable/disable logging, class-wide, not object-wide + */ ++ (void) setOpenGLLogging:(BOOL)logEnabled +{ + openGLLoggingEnabled = logEnabled; +} + + +/* + * Create the set of display lists for the bitmaps + */ +- (BOOL) makeGLDisplayListFirst:(unichar)first count:(int)count base:(GLint)base +{ + GLint curListIndex; + NSColor *blackColor; + NSDictionary *attribDict; + GLint dListNum; + NSString *currentChar; + unichar currentUnichar; + NSSize charSize; + NSRect charRect; + NSImage *theImage; + BOOL retval; + + // Make sure a list isn't already under construction + glGetIntegerv( GL_LIST_INDEX, &curListIndex ); + if( curListIndex != 0 ) + { + [ NSFont doOpenGLLog:@"Display list already under construction" ]; + return FALSE; + } + + // Save pixel unpacking state + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); + + glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); + glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE ); + glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); + glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + + blackColor = [ NSColor blackColor ]; + attribDict = [ NSDictionary dictionaryWithObjectsAndKeys: + self, NSFontAttributeName, + [ NSColor whiteColor ], + NSForegroundColorAttributeName, + blackColor, NSBackgroundColorAttributeName, + nil ]; + charRect.origin.x = charRect.origin.y = 0; + theImage = [ [ [ NSImage alloc ] initWithSize:NSMakeSize( 0, 0 ) ] + autorelease ]; + retval = TRUE; + for( dListNum = base, currentUnichar = first; currentUnichar < first + count; + dListNum++, currentUnichar++ ) + { + currentChar = [ NSString stringWithCharacters:¤tUnichar length:1 ]; + charSize = [ currentChar sizeWithAttributes:attribDict ]; + charRect.size = charSize; + charRect = NSIntegralRect( charRect ); + if( charRect.size.width > 0 && charRect.size.height > 0 ) + { + [ theImage setSize:charRect.size ]; + [ theImage lockFocus ]; + [ [ NSGraphicsContext currentContext ] setShouldAntialias:NO ]; + [ blackColor set ]; + [ NSBezierPath fillRect:charRect ]; + [ currentChar drawInRect:charRect withAttributes:attribDict ]; + [ theImage unlockFocus ]; + if( ![ self makeDisplayList:dListNum withImage:theImage ] ) + { + retval = FALSE; + break; + } + } + } + + glPopClientAttrib(); + + return retval; +} + + +/* + * Create one display list based on the given image. This assumes the image + * uses 8-bit chunks to represent a sample + */ +- (BOOL) makeDisplayList:(GLint)listNum withImage:(NSImage *)theImage +{ + NSBitmapImageRep *bitmap; + int bytesPerRow, pixelsHigh, pixelsWide, samplesPerPixel; + unsigned char *bitmapBytes; + int currentBit, byteValue; + unsigned char *newBuffer, *movingBuffer; + int rowIndex, colIndex; + + bitmap = [ NSBitmapImageRep imageRepWithData:[ theImage + TIFFRepresentationUsingCompression:NSTIFFCompressionNone + factor:0 ] ]; + pixelsHigh = [ bitmap pixelsHigh ]; + pixelsWide = [ bitmap pixelsWide ]; + bitmapBytes = [ bitmap bitmapData ]; + bytesPerRow = [ bitmap bytesPerRow ]; + samplesPerPixel = [ bitmap samplesPerPixel ]; + newBuffer = calloc( ceil( (float) bytesPerRow / 8.0 ), pixelsHigh ); + if( newBuffer == NULL ) + { + [ NSFont doOpenGLLog:@"Failed to calloc() memory in " + @"makeDisplayList:withImage:" ]; + return FALSE; + } + + movingBuffer = newBuffer; + /* + * Convert the color bitmap into a true bitmap, ie, one bit per pixel. We + * read at last row, write to first row as Cocoa and OpenGL have opposite + * y origins + */ + for( rowIndex = pixelsHigh - 1; rowIndex >= 0; rowIndex-- ) + { + currentBit = 0x80; + byteValue = 0; + for( colIndex = 0; colIndex < pixelsWide; colIndex++ ) + { + if( bitmapBytes[ rowIndex * bytesPerRow + colIndex * samplesPerPixel ] ) + byteValue |= currentBit; + currentBit >>= 1; + if( currentBit == 0 ) + { + *movingBuffer++ = byteValue; + currentBit = 0x80; + byteValue = 0; + } + } + /* + * Fill out the last byte; extra is ignored by OpenGL, but each row + * must start on a new byte + */ + if( currentBit != 0x80 ) + *movingBuffer++ = byteValue; + } + + glNewList( listNum, GL_COMPILE ); + glBitmap( pixelsWide, pixelsHigh, 0, 0, pixelsWide, 0, newBuffer ); + glEndList(); + free( newBuffer ); + + return TRUE; +} + + +/* + * Log the warning/error, if logging is enabled + */ ++ (void) doOpenGLLog:(NSString *)format, ... +{ + va_list args; + + if( openGLLoggingEnabled ) + { + va_start( args, format ); + NSLogv( [ NSString stringWithFormat:@"NSFont_OpenGL: %@\n", format ], + args ); + va_end( args ); + } +} + +@end diff --git a/source/shared_lib/sources/platform/macosx/gl_wrap.mm b/source/shared_lib/sources/platform/macosx/gl_wrap.mm new file mode 100644 index 000000000..dd67672cb --- /dev/null +++ b/source/shared_lib/sources/platform/macosx/gl_wrap.mm @@ -0,0 +1,206 @@ +//This file is part of Glest Shared Library (www.glest.org) +//Copyright (C) 2005 Matthias Braun + +//You can redistribute this code and/or modify it under +//the terms of the GNU General Public License as published by the Free Software +//Foundation; either version 2 of the License, or (at your option) any later +//version. +#include "gl_wrap.h" + +#include +#include +#include +#include + +#import + +#include "opengl.h" +#include "sdl_private.h" +#include "noimpl.h" +#include "util.h" +#include "window.h" +#include +//#include +#include "leak_dumper.h" + +using namespace Shared::Graphics::Gl; +using namespace Shared::Util; + +namespace Shared{ namespace Platform{ + +// ====================================== +// Global Fcs +// ====================================== + +BOOL makeDisplayList(GLint listNum, NSImage *theImage) +{ + NSBitmapImageRep *bitmap; + int bytesPerRow, pixelsHigh, pixelsWide, samplesPerPixel; + unsigned char *bitmapBytes; + int currentBit, byteValue; + unsigned char *newBuffer, *movingBuffer; + int rowIndex, colIndex; + + bitmap = [ NSBitmapImageRep imageRepWithData:[ theImage + TIFFRepresentationUsingCompression:NSTIFFCompressionNone + factor:0 ] ]; + pixelsHigh = [ bitmap pixelsHigh ]; + pixelsWide = [ bitmap pixelsWide ]; + bitmapBytes = [ bitmap bitmapData ]; + bytesPerRow = [ bitmap bytesPerRow ]; + samplesPerPixel = [ bitmap samplesPerPixel ]; + newBuffer = (unsigned char *)calloc( ceil( (float) bytesPerRow / 8.0 ), pixelsHigh ); + if( newBuffer == NULL ) + { + NSLog(@"Failed to calloc() memory in makeDisplayList()"); + return FALSE; + } + + movingBuffer = newBuffer; + /* + * Convert the color bitmap into a true bitmap, ie, one bit per pixel. We + * read at last row, write to first row as Cocoa and OpenGL have opposite + * y origins + */ + for( rowIndex = pixelsHigh - 1; rowIndex >= 0; rowIndex-- ) + { + currentBit = 0x80; + byteValue = 0; + for( colIndex = 0; colIndex < pixelsWide; colIndex++ ) + { + if( bitmapBytes[ rowIndex * bytesPerRow + colIndex * samplesPerPixel ] ) + byteValue |= currentBit; + currentBit >>= 1; + if( currentBit == 0 ) + { + *movingBuffer++ = byteValue; + currentBit = 0x80; + byteValue = 0; + } + } + /* + * Fill out the last byte; extra is ignored by OpenGL, but each row + * must start on a new byte + */ + if( currentBit != 0x80 ) + *movingBuffer++ = byteValue; + } + + glNewList( listNum, GL_COMPILE ); + glBitmap( pixelsWide, pixelsHigh, 0, 0, pixelsWide, 0, newBuffer ); + glEndList(); + free( newBuffer ); + + return TRUE; +} + +/* + * Create the set of display lists for the bitmaps + */ +BOOL makeGLDisplayListFirst(unichar first, int count, GLint base, NSFont *font, Shared::Graphics::FontMetrics &metrics) +{ + GLint curListIndex; + NSColor *blackColor = [NSColor blackColor]; + GLint dListNum; + NSString *currentChar; + unichar currentUnichar; + NSSize charSize; + NSRect charRect; + NSImage *theImage; + BOOL retval; + +// float ascent = [font ascender]; +// float descent = [font descender]; + + NSDictionary *attribDict = [ NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + [NSColor whiteColor], + NSForegroundColorAttributeName, + [NSColor blackColor], NSBackgroundColorAttributeName, + nil ]; + + // Make sure a list isn't already under construction + glGetIntegerv( GL_LIST_INDEX, &curListIndex ); + if( curListIndex != 0 ) + { + NSLog(@"Display list already under construction"); + return FALSE; + } + + // Save pixel unpacking state + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); + + glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); + glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE ); + glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); + glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + + charRect.origin.x = charRect.origin.y = 0; + theImage = [ [ [ NSImage alloc ] initWithSize:NSMakeSize( 0, 0 ) ] + autorelease ]; + retval = TRUE; + float fontHeight = metrics.getHeight(); + float dy; + + for( dListNum = base, currentUnichar = first; currentUnichar < first + count; + dListNum++, currentUnichar++ ) + { + currentChar = [ NSString stringWithCharacters:¤tUnichar length:1 ]; + + charSize = [ currentChar sizeWithAttributes:attribDict ]; + charRect.size = charSize; + charRect = NSIntegralRect( charRect ); + dy = charRect.size.height - fontHeight; + metrics.setWidth(dListNum-base, charRect.size.width); + //metrics.setVirticalOffset(dListNum-base, fontHeight - charRect.size.height); + + if( charRect.size.width > 0 && charRect.size.height > 0 ) + { + charRect.size.height = fontHeight; + [ theImage setSize:charRect.size ]; + [ theImage lockFocus ]; + [ [ NSGraphicsContext currentContext ] setShouldAntialias:NO ]; + [ blackColor set ]; + [ NSBezierPath fillRect:charRect ]; + //[ currentChar drawInRect:charRect withAttributes:attribDict ]; + [ currentChar drawAtPoint:NSMakePoint(0, 0) withAttributes:attribDict ]; + + [ theImage unlockFocus ]; + if( !makeDisplayList(dListNum, theImage) ) + { + retval = FALSE; + break; + } + } + } + glPopClientAttrib(); + + return retval; +} + +void createGlFontBitmaps(GLuint &base, const string &type, int size, int width, + int charCount, Shared::Graphics::FontMetrics &metrics) { + + + //@FF@ keep the reduction ratio ??? + size = (float)size * 0.80; + NSFont *font = [NSFont fontWithName:[NSString stringWithCString:"Arial" encoding:NSUTF8StringEncoding] size:size]; + if( font == nil ) + NSLog( @"font is nil\n" ); + + float fontHeight = [font ascender] - [font descender]; + + metrics.setHeight(fontHeight); + + if( !makeGLDisplayListFirst('\0', charCount, base, font, metrics) ) + NSLog( @"Didn't make display list\n" ); + +} + +void createGlFontOutlines(GLuint &base, const string &type, int width, + float depth, int charCount, Shared::Graphics::FontMetrics &metrics) { + NOIMPL; +} +}}//end namespace diff --git a/source/shared_lib/sources/platform/sdl/gl_wrap.cpp b/source/shared_lib/sources/platform/sdl/gl_wrap.cpp index 83e38296b..30cfb9055 100644 --- a/source/shared_lib/sources/platform/sdl/gl_wrap.cpp +++ b/source/shared_lib/sources/platform/sdl/gl_wrap.cpp @@ -12,10 +12,6 @@ #include #include -#ifdef X11_AVAILABLE -#include -#endif - #include "opengl.h" #include "sdl_private.h" #include "noimpl.h" @@ -143,227 +139,16 @@ void PlatformContextGl::makeCurrent() { void PlatformContextGl::swapBuffers() { SDL_GL_SwapBuffers(); } - -// ====================================== -// Global Fcs -// ====================================== - -#ifdef WIN32 - -int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, - NEWTEXTMETRICEX *lpntme, - int FontType, - LPARAM lParam) { - std::vector *systemFontList = (std::vector *)lParam; - systemFontList->push_back((char *)lpelfe->elfFullName); - return 1; // I want to get all fonts -} - -#endif - -void createGlFontBitmaps(uint32 &base, const string &type, int size, int width, - int charCount, FontMetrics &metrics) { -// -adecw-screen-medium-r-normal--18-180-75-75-m-160-gb2312.1980-1 this is a Chinese font - -#ifdef X11_AVAILABLE - Display* display = glXGetCurrentDisplay(); - if(display == 0) { - throw std::runtime_error("Couldn't create font: display is 0"); - } - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] trying to load font %s\n",__FILE__,__FUNCTION__,__LINE__,type.c_str()); - - XFontStruct* fontInfo = XLoadQueryFont(display, type.c_str()); - if(!fontInfo) { - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] CANNOT load font %s, falling back to default\n",__FILE__,__FUNCTION__,__LINE__,type.c_str()); - fontInfo = XLoadQueryFont(display, "fixed"); - if(!fontInfo) { - throw std::runtime_error("Font not found: " + type); - } - } - - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - - // we need the height of 'a' which sould ~ be half ascent+descent - float height = (static_cast(fontInfo->ascent + fontInfo->descent) / 2); - if(height <= 0) { - height = static_cast(6); - } - metrics.setHeight(height); - - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] height = %f\n",__FILE__,__FUNCTION__,__LINE__,height); - - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - - for(unsigned int i = 0; i < static_cast (charCount); ++i) { - - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - - if(i < fontInfo->min_char_or_byte2 || i > fontInfo->max_char_or_byte2) { - - float width = static_cast(6); - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] setting size = %f\n",__FILE__,__FUNCTION__,__LINE__,width); - - metrics.setWidth(i, width); - } else { - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - - int p = i - fontInfo->min_char_or_byte2; - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] p = %d fontInfo->per_char = %p\n",__FILE__,__FUNCTION__,__LINE__,p,fontInfo->per_char); - - if(fontInfo->per_char == NULL) { - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] type = [%s] p = %d fontInfo->per_char = %p\n",__FILE__,__FUNCTION__,__LINE__,type.c_str(),p,fontInfo->per_char); - - XCharStruct *charinfo = &(fontInfo->min_bounds); - //int charWidth = charinfo->rbearing - charinfo->lbearing; - //int charHeight = charinfo->ascent + charinfo->descent; - //int spanLength = (charWidth + 7) / 8; - - if(charinfo != NULL) { - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] type = [%s] charinfo->width = %d\n",__FILE__,__FUNCTION__,__LINE__,type.c_str(),charinfo->width); - metrics.setWidth(i, static_cast (std::max((short)0,charinfo->width))); - } - else { - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] type = [%s] using size 6\n",__FILE__,__FUNCTION__,__LINE__,type.c_str()); - - metrics.setWidth(i, static_cast(6)); - } - } - else { - float width = static_cast(fontInfo->per_char[p].width); //( fontInfo->per_char[p].rbearing - fontInfo->per_char[p].lbearing); - if(width <= 0) { - width = static_cast(6); - } - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] type = [%s] using size = %f\n",__FILE__,__FUNCTION__,__LINE__,type.c_str(),width); - metrics.setWidth(i, width); - } - } - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - } - - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - - glXUseXFont(fontInfo->fid, 0, charCount, base); - - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - - GLenum glerror = ::glGetError(); - - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] glerror = %d\n",__FILE__,__FUNCTION__,__LINE__,glerror); - - XFreeFont(display, fontInfo); - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); -#else - // we badly need a solution portable to more than just glx - //NOIMPL; - - std::string useRealFontName = type; - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] trying to load useRealFontName [%s], size = %d, width = %d\n",__FILE__,__FUNCTION__,__LINE__,useRealFontName.c_str(),size,width); - - static std::vector systemFontList; - if(systemFontList.size() == 0) { - LOGFONT lf; - //POSITION pos; - //lf.lfCharSet = ANSI_CHARSET; - lf.lfCharSet = (BYTE)charSet; - lf.lfFaceName[0]='\0'; - - HDC hDC = wglGetCurrentDC(); - ::EnumFontFamiliesEx(hDC, - &lf, - (FONTENUMPROC) EnumFontFamExProc, - (LPARAM) &systemFontList, 0); - - for(unsigned int idx = 0; idx < systemFontList.size(); ++idx) { - string &fontName = systemFontList[idx]; - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found system font [%s]\n",__FILE__,__FUNCTION__,__LINE__,fontName.c_str()); - } - } - else { - for(unsigned int idx = 0; idx < systemFontList.size(); ++idx) { - string &fontName = systemFontList[idx]; - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] checking font [%s]\n",__FILE__,__FUNCTION__,__LINE__,fontName.c_str()); - - if(_stricmp(useRealFontName.c_str(),fontName.c_str()) != 0) { - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] switch font name from [%s] to [%s]\n",__FILE__,__FUNCTION__,__LINE__,useRealFontName.c_str(),fontName.c_str()); - - useRealFontName = fontName; - break; - } - } - } - - HFONT font= CreateFont( - size, 0, 0, 0, width, FALSE, FALSE, FALSE, charSet, - OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, - DEFAULT_PITCH| (useRealFontName.c_str() ? FF_DONTCARE:FF_SWISS), useRealFontName.c_str()); - - assert(font!=NULL); - - HDC dc= wglGetCurrentDC(); - SelectObject(dc, font); - BOOL err= wglUseFontBitmaps(dc, 0, charCount, base); - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] wglUseFontBitmaps returned = %d, charCount = %d, base = %d\n",__FILE__,__FUNCTION__,__LINE__,err,charCount,base); - - FIXED one; - one.value= 1; - one.fract= 0; - - FIXED zero; - zero.value= 0; - zero.fract= 0; - - MAT2 mat2; - mat2.eM11= one; - mat2.eM12= zero; - mat2.eM21= zero; - mat2.eM22= one; - //MAT2 mat2 = {{0,1},{0,0},{0,0},{0,1}}; - - - //metrics - GLYPHMETRICS glyphMetrics; - int errorCode= GetGlyphOutline(dc, 'a', GGO_METRICS, &glyphMetrics, 0, NULL, &mat2); - - SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] GetGlyphOutline returned = %d\n",__FILE__,__FUNCTION__,__LINE__,errorCode); - - if(errorCode!=GDI_ERROR){ - metrics.setHeight(static_cast(glyphMetrics.gmBlackBoxY)); + + const char *getPlatformExtensions(const PlatformContextGl *pcgl) { + return ""; } - for(int i=0; i(glyphMetrics.gmCellIncX)); - } - else { - //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] GetGlyphOutline returned = %d for i = %d\n",__FILE__,__FUNCTION__,__LINE__,errorCode,i); - metrics.setWidth(i, static_cast(6)); - } + + void *getGlProcAddress(const char *procName) { + void* proc = SDL_GL_GetProcAddress(procName); + assert(proc!=NULL); + return proc; } - DeleteObject(font); - - assert(err); - -#endif -} - -void createGlFontOutlines(uint32 &base, const string &type, int width, - float depth, int charCount, FontMetrics &metrics) { - NOIMPL; -} - -const char *getPlatformExtensions(const PlatformContextGl *pcgl) { - return ""; -} - -void *getGlProcAddress(const char *procName) { - void* proc = SDL_GL_GetProcAddress(procName); - assert(proc!=NULL); - return proc; -} - -}}//end namespace +}}//end namespace diff --git a/source/shared_lib/sources/platform/unix/gl_wrap.cpp b/source/shared_lib/sources/platform/unix/gl_wrap.cpp new file mode 100644 index 000000000..1b6a9ef5b --- /dev/null +++ b/source/shared_lib/sources/platform/unix/gl_wrap.cpp @@ -0,0 +1,74 @@ +//This file is part of Glest Shared Library (www.glest.org) +//Copyright (C) 2005 Matthias Braun + +//You can redistribute this code and/or modify it under +//the terms of the GNU General Public License as published by the Free Software +//Foundation; either version 2 of the License, or (at your option) any later +//version. +#include "gl_wrap.h" + +#include +#include +#include +#include + + +#include + +#include "opengl.h" +#include "sdl_private.h" +#include "noimpl.h" +#include "util.h" +#include "window.h" +#include +//#include +#include "leak_dumper.h" + +using namespace Shared::Graphics::Gl; +using namespace Shared::Util; + +namespace Shared{ namespace Platform{ + + + +// ====================================== +// Global Fcs +// ====================================== + +void createGlFontBitmaps(uint32 &base, const string &type, int size, int width, + int charCount, FontMetrics &metrics) { + Display* display = glXGetCurrentDisplay(); + if(display == 0) { + throw std::runtime_error("Couldn't create font: display is 0"); + } + XFontStruct* fontInfo = XLoadQueryFont(display, type.c_str()); + if(!fontInfo) { + throw std::runtime_error("Font not found."); + } + + // we need the height of 'a' which sould ~ be half ascent+descent + metrics.setHeight(static_cast + (fontInfo->ascent + fontInfo->descent) / 2); + for(unsigned int i = 0; i < static_cast (charCount); ++i) { + if(i < fontInfo->min_char_or_byte2 || + i > fontInfo->max_char_or_byte2) { + metrics.setWidth(i, static_cast(6)); + } else { + int p = i - fontInfo->min_char_or_byte2; + metrics.setWidth(i, static_cast ( + fontInfo->per_char[p].rbearing + - fontInfo->per_char[p].lbearing)); + } + } + + glXUseXFont(fontInfo->fid, 0, charCount, base); + XFreeFont(display, fontInfo); +} + +void createGlFontOutlines(uint32 &base, const string &type, int width, + float depth, int charCount, FontMetrics &metrics) { + NOIMPL; +} + + +}}//end namespace diff --git a/source/shared_lib/sources/platform/win32/gl_wrap.cpp b/source/shared_lib/sources/platform/win32/gl_wrap.cpp new file mode 100644 index 000000000..1623d40fa --- /dev/null +++ b/source/shared_lib/sources/platform/win32/gl_wrap.cpp @@ -0,0 +1,145 @@ +//This file is part of Glest Shared Library (www.glest.org) +//Copyright (C) 2005 Matthias Braun + +//You can redistribute this code and/or modify it under +//the terms of the GNU General Public License as published by the Free Software +//Foundation; either version 2 of the License, or (at your option) any later +//version. +#include "gl_wrap.h" + +#include +#include +#include +#include + +#include "opengl.h" +#include "sdl_private.h" +#include "noimpl.h" +#include "util.h" +#include "window.h" +#include +//#include +#include "leak_dumper.h" + +using namespace Shared::Graphics::Gl; +using namespace Shared::Util; + +namespace Shared{ namespace Platform{ + + + + // ====================================== + // Global Fcs + // ====================================== + + int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, + NEWTEXTMETRICEX *lpntme, + int FontType, + LPARAM lParam) { + std::vector *systemFontList = (std::vector *)lParam; + systemFontList->push_back((char *)lpelfe->elfFullName); + return 1; // I want to get all fonts + } + + void createGlFontBitmaps(uint32 &base, const string &type, int size, int width, + int charCount, FontMetrics &metrics) { + // -adecw-screen-medium-r-normal--18-180-75-75-m-160-gb2312.1980-1 this is a Chinese font + + std::string useRealFontName = type; + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] trying to load useRealFontName [%s], size = %d, width = %d\n",__FILE__,__FUNCTION__,__LINE__,useRealFontName.c_str(),size,width); + + static std::vector systemFontList; + if(systemFontList.size() == 0) { + LOGFONT lf; + //POSITION pos; + //lf.lfCharSet = ANSI_CHARSET; + lf.lfCharSet = (BYTE)charSet; + lf.lfFaceName[0]='\0'; + + HDC hDC = wglGetCurrentDC(); + ::EnumFontFamiliesEx(hDC, + &lf, + (FONTENUMPROC) EnumFontFamExProc, + (LPARAM) &systemFontList, 0); + + for(unsigned int idx = 0; idx < systemFontList.size(); ++idx) { + string &fontName = systemFontList[idx]; + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found system font [%s]\n",__FILE__,__FUNCTION__,__LINE__,fontName.c_str()); + } + } + else { + for(unsigned int idx = 0; idx < systemFontList.size(); ++idx) { + string &fontName = systemFontList[idx]; + //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] checking font [%s]\n",__FILE__,__FUNCTION__,__LINE__,fontName.c_str()); + + if(_stricmp(useRealFontName.c_str(),fontName.c_str()) != 0) { + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] switch font name from [%s] to [%s]\n",__FILE__,__FUNCTION__,__LINE__,useRealFontName.c_str(),fontName.c_str()); + + useRealFontName = fontName; + break; + } + } + } + + HFONT font= CreateFont( + size, 0, 0, 0, width, FALSE, FALSE, FALSE, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH| (useRealFontName.c_str() ? FF_DONTCARE:FF_SWISS), useRealFontName.c_str()); + + assert(font!=NULL); + + HDC dc= wglGetCurrentDC(); + SelectObject(dc, font); + BOOL err= wglUseFontBitmaps(dc, 0, charCount, base); + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] wglUseFontBitmaps returned = %d, charCount = %d, base = %d\n",__FILE__,__FUNCTION__,__LINE__,err,charCount,base); + + FIXED one; + one.value= 1; + one.fract= 0; + + FIXED zero; + zero.value= 0; + zero.fract= 0; + + MAT2 mat2; + mat2.eM11= one; + mat2.eM12= zero; + mat2.eM21= zero; + mat2.eM22= one; + + //MAT2 mat2 = {{0,1},{0,0},{0,0},{0,1}}; + + + //metrics + GLYPHMETRICS glyphMetrics; + int errorCode= GetGlyphOutline(dc, 'a', GGO_METRICS, &glyphMetrics, 0, NULL, &mat2); + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] GetGlyphOutline returned = %d\n",__FILE__,__FUNCTION__,__LINE__,errorCode); + + if(errorCode!=GDI_ERROR){ + metrics.setHeight(static_cast(glyphMetrics.gmBlackBoxY)); + } + for(int i=0; i(glyphMetrics.gmCellIncX)); + } + else { + //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] GetGlyphOutline returned = %d for i = %d\n",__FILE__,__FUNCTION__,__LINE__,errorCode,i); + metrics.setWidth(i, static_cast(6)); + } + } + + DeleteObject(font); + + assert(err); + + } + + void createGlFontOutlines(uint32 &base, const string &type, int width, + float depth, int charCount, FontMetrics &metrics) { + NOIMPL; + } + +}}//end namespace