Compile with clang and add cotire
* Add cotire cmake module to speedup compilation https://github.com/sakra/cotire * Fix clang error and warnings * Rename Font to BitmapFont to fix conflict with Xlib.g Font typedef * Remove legacy PCH support * Improve Position hash
This commit is contained in:
		
							parent
							
								
									4813b7eb4b
								
							
						
					
					
						commit
						10b33c6124
					
				|  | @ -28,8 +28,8 @@ ADD_EXECUTABLE(otclient ${framework_SOURCES} ${otclient_SOURCES} ${executable_SO | |||
| TARGET_LINK_LIBRARIES(otclient ${framework_LIBRARIES}) | ||||
| 
 | ||||
| IF(PCH) | ||||
|     FIND_PACKAGE(PCHSupport REQUIRED) | ||||
|     ADD_PRECOMPILED_HEADER(otclient ${CMAKE_CURRENT_SOURCE_DIR}/src/framework/pch.h) | ||||
|     include(cotire) | ||||
|     cotire(otclient) | ||||
|     MESSAGE(STATUS "Use precompiled header: ON") | ||||
| ELSE() | ||||
|     MESSAGE(STATUS "Use precompiled header: OFF") | ||||
|  |  | |||
|  | @ -207,8 +207,8 @@ SET(framework_SOURCES ${framework_SOURCES} | |||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/coordsbuffer.cpp | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/coordsbuffer.h | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/declarations.h | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/font.cpp | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/font.h | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/bitmapfont.cpp | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/bitmapfont.h | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/fontmanager.cpp | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/fontmanager.h | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/graphics/framebuffer.cpp | ||||
|  |  | |||
|  | @ -1,315 +0,0 @@ | |||
| # - Try to find precompiled headers support for GCC 3.4 and 4.x (and MSVC) | ||||
| # Once done this will define: | ||||
| # | ||||
| # Variable: | ||||
| #   PCHSupport_FOUND | ||||
| # | ||||
| # Macro: | ||||
| #   ADD_PRECOMPILED_HEADER  _targetName _input  _dowarn | ||||
| #   ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use _dowarn | ||||
| #   ADD_NATIVE_PRECOMPILED_HEADER _targetName _input _dowarn | ||||
| #   GET_NATIVE_PRECOMPILED_HEADER _targetName _input | ||||
| 
 | ||||
| IF(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
|     EXEC_PROGRAM( | ||||
|       ${CMAKE_CXX_COMPILER} | ||||
|       ARGS     ${CMAKE_CXX_COMPILER_ARG1} -dumpversion | ||||
|       OUTPUT_VARIABLE gcc_compiler_version | ||||
|     ) | ||||
|     #MESSAGE("GCC Version: ${gcc_compiler_version}") | ||||
|     IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") | ||||
|       SET(PCHSupport_FOUND TRUE) | ||||
|     ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") | ||||
|       IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") | ||||
|         SET(PCHSupport_FOUND TRUE) | ||||
|       ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") | ||||
|     ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") | ||||
| 
 | ||||
|     SET(_PCH_include_prefix "-I") | ||||
| 
 | ||||
| ELSE(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
|     IF(WIN32) | ||||
|       SET(PCHSupport_FOUND TRUE) # for experimental msvc support | ||||
|       SET(_PCH_include_prefix "/I") | ||||
|     ELSE(WIN32) | ||||
|       SET(PCHSupport_FOUND FALSE) | ||||
|     ENDIF(WIN32) | ||||
| 
 | ||||
| ENDIF(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
| MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags) | ||||
| 
 | ||||
|   STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) | ||||
|   SET(${_out_compile_flags} ${${_flags_var_name}} ) | ||||
| 
 | ||||
|   IF(CMAKE_COMPILER_IS_GNUCXX) | ||||
|     GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE) | ||||
|     IF(${_targetType} STREQUAL SHARED_LIBRARY AND NOT WIN32) | ||||
|       LIST(APPEND ${_out_compile_flags} -fPIC) | ||||
|     ENDIF() | ||||
| 
 | ||||
|   ELSE(CMAKE_COMPILER_IS_GNUCXX) | ||||
|     ## TODO ... ? or does it work out of the box | ||||
|   ENDIF(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
|   GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES ) | ||||
|   FOREACH(item ${DIRINC}) | ||||
|     LIST(APPEND ${_out_compile_flags} "${_PCH_include_prefix}${item}") | ||||
|   ENDFOREACH(item) | ||||
| 
 | ||||
|   GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS) | ||||
|   GET_DIRECTORY_PROPERTY(_global_definitions DIRECTORY ${CMAKE_SOURCE_DIR} DEFINITIONS) | ||||
|   #MESSAGE("_directory_flags ${_directory_flags} ${_global_definitions}" ) | ||||
|   LIST(APPEND ${_out_compile_flags} ${_directory_flags}) | ||||
|   LIST(APPEND ${_out_compile_flags} ${_global_definitions}) | ||||
|   LIST(APPEND ${_out_compile_flags} ${CMAKE_CXX_FLAGS} ) | ||||
| 
 | ||||
|   SEPARATE_ARGUMENTS(${_out_compile_flags}) | ||||
| 
 | ||||
| ENDMACRO(_PCH_GET_COMPILE_FLAGS) | ||||
| 
 | ||||
| MACRO(_PCH_WRITE_PCHDEP_CXX _targetName _include_file _dephelp) | ||||
| 
 | ||||
|   SET(${_dephelp} ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pch_dephelp.cxx) | ||||
|   FILE(WRITE  ${${_dephelp}} | ||||
| "#include \"${_include_file}\" | ||||
| int testfunction() | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| " | ||||
|   ) | ||||
| 
 | ||||
| ENDMACRO(_PCH_WRITE_PCHDEP_CXX ) | ||||
| 
 | ||||
| MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _output) | ||||
| 
 | ||||
|     FILE(TO_NATIVE_PATH ${_input} _native_input) | ||||
|     FILE(TO_NATIVE_PATH ${_output} _native_output) | ||||
| 
 | ||||
| 
 | ||||
|     IF(CMAKE_COMPILER_IS_GNUCXX) | ||||
|       IF(CMAKE_CXX_COMPILER_ARG1) | ||||
|     # remove leading space in compiler argument | ||||
|         STRING(REGEX REPLACE "^ +" "" pchsupport_compiler_cxx_arg1 ${CMAKE_CXX_COMPILER_ARG1}) | ||||
| 
 | ||||
|     SET(${out_command} | ||||
|       ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS}    -x c++-header -o ${_output} ${_input} | ||||
|       ) | ||||
|       ELSE(CMAKE_CXX_COMPILER_ARG1) | ||||
|     SET(${out_command} | ||||
|       ${CMAKE_CXX_COMPILER}  ${_compile_FLAGS}    -x c++-header -o ${_output} ${_input} | ||||
|       ) | ||||
|       ENDIF(CMAKE_CXX_COMPILER_ARG1) | ||||
|     ELSE(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
|     SET(_dummy_str "#include <${_input}>") | ||||
|     FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/pch_dummy.cpp ${_dummy_str}) | ||||
| 
 | ||||
|     SET(${out_command} | ||||
|         ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} /c /Fp${_native_output} /Yc${_native_input} pch_dummy.cpp | ||||
|     ) | ||||
|     #/out:${_output} | ||||
| 
 | ||||
|     ENDIF(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
| ENDMACRO(_PCH_GET_COMPILE_COMMAND ) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| MACRO(_PCH_GET_TARGET_COMPILE_FLAGS _cflags  _header_name _pch_path _dowarn ) | ||||
| 
 | ||||
|   FILE(TO_NATIVE_PATH ${_pch_path} _native_pch_path) | ||||
| 
 | ||||
|   IF(CMAKE_COMPILER_IS_GNUCXX) | ||||
|     # for use with distcc and gcc >4.0.1 if preprocessed files are accessible | ||||
|     # on all remote machines set | ||||
|     # PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess | ||||
|     # if you want warnings for invalid header files (which is very inconvenient | ||||
|     # if you have different versions of the headers for different build types | ||||
|     # you may set _pch_dowarn | ||||
|     IF (_dowarn) | ||||
|       SET(${_cflags} "${PCH_ADDITIONAL_COMPILER_FLAGS} -include ${CMAKE_CURRENT_BINARY_DIR}/${_header_name} -Winvalid-pch " ) | ||||
|     ELSE (_dowarn) | ||||
|       SET(${_cflags} "${PCH_ADDITIONAL_COMPILER_FLAGS} -include ${CMAKE_CURRENT_BINARY_DIR}/${_header_name} " ) | ||||
|     ENDIF (_dowarn) | ||||
|   ELSE(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
|     set(${_cflags} "/Fp${_native_pch_path} /Yu${_header_name}" ) | ||||
| 
 | ||||
|   ENDIF(CMAKE_COMPILER_IS_GNUCXX) | ||||
| 
 | ||||
| ENDMACRO(_PCH_GET_TARGET_COMPILE_FLAGS ) | ||||
| 
 | ||||
| MACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input _output) | ||||
|   GET_FILENAME_COMPONENT(_name ${_input} NAME) | ||||
|   GET_FILENAME_COMPONENT(_path ${_input} PATH) | ||||
|   SET(_output "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch/${_targetName}_${CMAKE_BUILD_TYPE}.gch") | ||||
| ENDMACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input) | ||||
| 
 | ||||
| 
 | ||||
| MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use ) | ||||
| 
 | ||||
|   # to do: test whether compiler flags match between target  _targetName | ||||
|   # and _pch_output_to_use | ||||
|   GET_FILENAME_COMPONENT(_name ${_input} NAME) | ||||
| 
 | ||||
|   IF( "${ARGN}" STREQUAL "0") | ||||
|     SET(_dowarn 0) | ||||
|   ELSE( "${ARGN}" STREQUAL "0") | ||||
|     SET(_dowarn 1) | ||||
|   ENDIF("${ARGN}" STREQUAL "0") | ||||
| 
 | ||||
| 
 | ||||
|   _PCH_GET_TARGET_COMPILE_FLAGS(_target_cflags ${_name} ${_pch_output_to_use} ${_dowarn}) | ||||
|   #   MESSAGE("Add flags ${_target_cflags} to ${_targetName} " ) | ||||
|   SET_TARGET_PROPERTIES(${_targetName} | ||||
|     PROPERTIES | ||||
|     COMPILE_FLAGS ${_target_cflags} | ||||
|   ) | ||||
| 
 | ||||
|   ADD_CUSTOM_TARGET(pch_Generate_${_targetName} | ||||
|     DEPENDS    ${_pch_output_to_use} | ||||
|   ) | ||||
| 
 | ||||
|   ADD_DEPENDENCIES(${_targetName} pch_Generate_${_targetName} ) | ||||
| 
 | ||||
| ENDMACRO(ADD_PRECOMPILED_HEADER_TO_TARGET) | ||||
| 
 | ||||
| MACRO(ADD_PRECOMPILED_HEADER _targetName _input) | ||||
| 
 | ||||
|   SET(_PCH_current_target ${_targetName}) | ||||
| 
 | ||||
|   IF(NOT CMAKE_BUILD_TYPE) | ||||
|     MESSAGE(FATAL_ERROR | ||||
|       "This is the ADD_PRECOMPILED_HEADER macro. " | ||||
|       "You must set CMAKE_BUILD_TYPE!" | ||||
|       ) | ||||
|   ENDIF(NOT CMAKE_BUILD_TYPE) | ||||
| 
 | ||||
|   IF( "${ARGN}" STREQUAL "0") | ||||
|     SET(_dowarn 0) | ||||
|   ELSE( "${ARGN}" STREQUAL "0") | ||||
|     SET(_dowarn 1) | ||||
|   ENDIF("${ARGN}" STREQUAL "0") | ||||
| 
 | ||||
|   GET_FILENAME_COMPONENT(_name ${_input} NAME) | ||||
|   GET_FILENAME_COMPONENT(_path ${_input} PATH) | ||||
|   GET_PRECOMPILED_HEADER_OUTPUT( ${_targetName} ${_input} _output) | ||||
| 
 | ||||
|   GET_FILENAME_COMPONENT(_outdir ${_output} PATH ) | ||||
| 
 | ||||
|   GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE) | ||||
|    _PCH_WRITE_PCHDEP_CXX(${_targetName} ${_input} _pch_dephelp_cxx) | ||||
| 
 | ||||
|   IF(${_targetType} STREQUAL SHARED_LIBRARY) | ||||
|     ADD_LIBRARY(${_targetName}_pch_dephelp STATIC ${_pch_dephelp_cxx} ) | ||||
|   ELSE(${_targetType} STREQUAL SHARED_LIBRARY) | ||||
|     ADD_LIBRARY(${_targetName}_pch_dephelp STATIC ${_pch_dephelp_cxx}) | ||||
|   ENDIF(${_targetType} STREQUAL SHARED_LIBRARY) | ||||
| 
 | ||||
|   FILE(MAKE_DIRECTORY ${_outdir}) | ||||
| 
 | ||||
|   _PCH_GET_COMPILE_FLAGS(_compile_FLAGS) | ||||
| 
 | ||||
|   #MESSAGE("_compile_FLAGS: ${_compile_FLAGS}") | ||||
|   #message("COMMAND ${CMAKE_CXX_COMPILER}    ${_compile_FLAGS} -x c++-header -o ${_output} ${_input}") | ||||
|   SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/${_name} PROPERTIES GENERATED 1) | ||||
|   ADD_CUSTOM_COMMAND( | ||||
|    OUTPUT    ${CMAKE_CURRENT_BINARY_DIR}/${_name} | ||||
|    COMMAND ${CMAKE_COMMAND} -E copy  ${_input} ${CMAKE_CURRENT_BINARY_DIR}/${_name} # ensure same directory! Required by gcc | ||||
|    DEPENDS ${_input} | ||||
|   ) | ||||
| 
 | ||||
|   #message("_command  ${_input} ${_output}") | ||||
|   _PCH_GET_COMPILE_COMMAND(_command  ${CMAKE_CURRENT_BINARY_DIR}/${_name} ${_output} ) | ||||
| 
 | ||||
|   #message(${_input} ) | ||||
|   #message("_output ${_output}") | ||||
| 
 | ||||
|   ADD_CUSTOM_COMMAND( | ||||
|     OUTPUT ${_output} | ||||
|     COMMAND ${_command} | ||||
|     DEPENDS ${_input}   ${CMAKE_CURRENT_BINARY_DIR}/${_name} ${_targetName}_pch_dephelp | ||||
|   ) | ||||
| 
 | ||||
|   ADD_PRECOMPILED_HEADER_TO_TARGET(${_targetName} ${_input}  ${_output} ${_dowarn}) | ||||
| ENDMACRO(ADD_PRECOMPILED_HEADER) | ||||
| 
 | ||||
| # Generates the use of precompiled in a target, | ||||
| # without using depency targets (2 extra for each target) | ||||
| # Using Visual, must also add ${_targetName}_pch to sources | ||||
| # Not needed by Xcode | ||||
| 
 | ||||
| MACRO(GET_NATIVE_PRECOMPILED_HEADER _targetName _input) | ||||
| 
 | ||||
|     if(CMAKE_GENERATOR MATCHES Visual*) | ||||
| 
 | ||||
|     SET(_dummy_str "#include \"${_input}\"\n" | ||||
|                     "// This is required to suppress LNK4221.  Very annoying.\n" | ||||
|                     "void *g_${_targetName}Dummy = 0\;\n") | ||||
| 
 | ||||
|     # Use of cxx extension for generated files (as Qt does) | ||||
|     SET(${_targetName}_pch ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pch.cxx) | ||||
|     if(EXISTS ${${_targetName}_pch}) | ||||
|         # Check if contents is the same, if not rewrite | ||||
|         # todo | ||||
|     else(EXISTS ${${_targetName}_pch}) | ||||
|         FILE(WRITE ${${_targetName}_pch} ${_dummy_str}) | ||||
|     endif(EXISTS ${${_targetName}_pch}) | ||||
|     endif(CMAKE_GENERATOR MATCHES Visual*) | ||||
| 
 | ||||
| ENDMACRO(GET_NATIVE_PRECOMPILED_HEADER) | ||||
| 
 | ||||
| MACRO(ADD_NATIVE_PRECOMPILED_HEADER _targetName _input) | ||||
| 
 | ||||
|     IF( "${ARGN}" STREQUAL "0") | ||||
|     SET(_dowarn 0) | ||||
|     ELSE( "${ARGN}" STREQUAL "0") | ||||
|     SET(_dowarn 1) | ||||
|     ENDIF("${ARGN}" STREQUAL "0") | ||||
| 
 | ||||
|     if(CMAKE_GENERATOR MATCHES Visual*) | ||||
|     # Auto include the precompile (useful for moc processing, since the use of | ||||
|     # precompiled is specified at the target level | ||||
|     # and I don't want to specifiy /F- for each moc/res/ui generated files (using Qt) | ||||
| 
 | ||||
|     GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) | ||||
|     if (${oldProps} MATCHES NOTFOUND) | ||||
|         SET(oldProps "") | ||||
|     endif(${oldProps} MATCHES NOTFOUND) | ||||
| 
 | ||||
|     SET(newProperties "${oldProps} /Yu\"${_input}.h\" /FI\"${_input}.h\"") | ||||
|     SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "${newProperties}") | ||||
| 
 | ||||
|     #also inlude ${oldProps} to have the same compile options | ||||
|     SET_SOURCE_FILES_PROPERTIES(${_input}.cpp PROPERTIES COMPILE_FLAGS "${oldProps} /Yc\"${_input}.h\"") | ||||
| 
 | ||||
|     else(CMAKE_GENERATOR MATCHES Visual*) | ||||
| 
 | ||||
|     if (CMAKE_GENERATOR MATCHES Xcode) | ||||
|         # For Xcode, cmake needs my patch to process | ||||
|         # GCC_PREFIX_HEADER and GCC_PRECOMPILE_PREFIX_HEADER as target properties | ||||
| 
 | ||||
|         GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) | ||||
|         if (${oldProps} MATCHES NOTFOUND) | ||||
|         SET(oldProps "") | ||||
|         endif(${oldProps} MATCHES NOTFOUND) | ||||
| 
 | ||||
|         # When buiding out of the tree, precompiled may not be located | ||||
|         # Use full path instead. | ||||
|         GET_FILENAME_COMPONENT(fullPath ${_input} ABSOLUTE) | ||||
| 
 | ||||
|         SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${fullPath}") | ||||
|         SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES") | ||||
| 
 | ||||
|     else (CMAKE_GENERATOR MATCHES Xcode) | ||||
| 
 | ||||
|         #Fallback to the "old" precompiled suppport | ||||
|         #ADD_PRECOMPILED_HEADER(${_targetName} ${_input} ${_dowarn}) | ||||
|     endif(CMAKE_GENERATOR MATCHES Xcode) | ||||
|     endif(CMAKE_GENERATOR MATCHES Visual*) | ||||
| 
 | ||||
| ENDMACRO(ADD_NATIVE_PRECOMPILED_HEADER) | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -20,14 +20,14 @@ | |||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #include "font.h" | ||||
| #include "bitmapfont.h" | ||||
| #include "texturemanager.h" | ||||
| #include "graphics.h" | ||||
| #include "image.h" | ||||
| 
 | ||||
| #include <framework/otml/otml.h> | ||||
| 
 | ||||
| void Font::load(const OTMLNodePtr& fontNode) | ||||
| void BitmapFont::load(const OTMLNodePtr& fontNode) | ||||
| { | ||||
|     OTMLNodePtr textureNode = fontNode->at("texture"); | ||||
|     std::string textureFile = stdext::resolve_path(textureNode->value(), textureNode->source()); | ||||
|  | @ -66,14 +66,14 @@ void Font::load(const OTMLNodePtr& fontNode) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| void Font::drawText(const std::string& text, const Point& startPos) | ||||
| void BitmapFont::drawText(const std::string& text, const Point& startPos) | ||||
| { | ||||
|     Size boxSize = g_painter->getResolution() - startPos.toSize(); | ||||
|     Rect screenCoords(startPos, boxSize); | ||||
|     drawText(text, screenCoords, Fw::AlignTopLeft); | ||||
| } | ||||
| 
 | ||||
| void Font::drawText(const std::string& text, const Rect& screenCoords, Fw::AlignmentFlag align) | ||||
| void BitmapFont::drawText(const std::string& text, const Rect& screenCoords, Fw::AlignmentFlag align) | ||||
| { | ||||
|     static CoordsBuffer coordsBuffer; | ||||
|     coordsBuffer.clear(); | ||||
|  | @ -82,7 +82,7 @@ void Font::drawText(const std::string& text, const Rect& screenCoords, Fw::Align | |||
|     g_painter->drawTextureCoords(coordsBuffer, m_texture); | ||||
| } | ||||
| 
 | ||||
| void Font::calculateDrawTextCoords(CoordsBuffer& coordsBuffer, const std::string& text, const Rect& screenCoords, Fw::AlignmentFlag align) | ||||
| void BitmapFont::calculateDrawTextCoords(CoordsBuffer& coordsBuffer, const std::string& text, const Rect& screenCoords, Fw::AlignmentFlag align) | ||||
| { | ||||
|     // prevent glitches from invalid rects
 | ||||
|     if(!screenCoords.isValid() || !m_texture) | ||||
|  | @ -158,7 +158,7 @@ void Font::calculateDrawTextCoords(CoordsBuffer& coordsBuffer, const std::string | |||
|     } | ||||
| } | ||||
| 
 | ||||
| const std::vector<Point>& Font::calculateGlyphsPositions(const std::string& text, | ||||
| const std::vector<Point>& BitmapFont::calculateGlyphsPositions(const std::string& text, | ||||
|                                                          Fw::AlignmentFlag align, | ||||
|                                                          Size *textBoxSize) const | ||||
| { | ||||
|  | @ -242,14 +242,14 @@ const std::vector<Point>& Font::calculateGlyphsPositions(const std::string& text | |||
|     return glyphsPositions; | ||||
| } | ||||
| 
 | ||||
| Size Font::calculateTextRectSize(const std::string& text) | ||||
| Size BitmapFont::calculateTextRectSize(const std::string& text) | ||||
| { | ||||
|     Size size; | ||||
|     calculateGlyphsPositions(text, Fw::AlignTopLeft, &size); | ||||
|     return size; | ||||
| } | ||||
| 
 | ||||
| void Font::calculateGlyphsWidthsAutomatically(const ImagePtr& image, const Size& glyphSize) | ||||
| void BitmapFont::calculateGlyphsWidthsAutomatically(const ImagePtr& image, const Size& glyphSize) | ||||
| { | ||||
|     int numHorizontalGlyphs = image->getSize().width() / glyphSize.width(); | ||||
|     auto texturePixels = image->getPixels(); | ||||
|  | @ -280,7 +280,7 @@ void Font::calculateGlyphsWidthsAutomatically(const ImagePtr& image, const Size& | |||
|     } | ||||
| } | ||||
| 
 | ||||
| std::string Font::wrapText(const std::string& text, int maxWidth) | ||||
| std::string BitmapFont::wrapText(const std::string& text, int maxWidth) | ||||
| { | ||||
|     std::string outText; | ||||
|     std::string line; | ||||
|  | @ -20,18 +20,18 @@ | |||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef FONT_H | ||||
| #define FONT_H | ||||
| #ifndef BITMAPFONT_H | ||||
| #define BITMAPFONT_H | ||||
| 
 | ||||
| #include "declarations.h" | ||||
| 
 | ||||
| #include <framework/otml/declarations.h> | ||||
| #include <framework/graphics/coordsbuffer.h> | ||||
| 
 | ||||
| class Font | ||||
| class BitmapFont | ||||
| { | ||||
| public: | ||||
|     Font(const std::string& name) : m_name(name) { } | ||||
|     BitmapFont(const std::string& name) : m_name(name) { } | ||||
| 
 | ||||
|     /// Load font from otml node
 | ||||
|     void load(const OTMLNodePtr& fontNode); | ||||
|  | @ -23,7 +23,7 @@ | |||
| #include "cachedtext.h" | ||||
| #include "painter.h" | ||||
| #include "fontmanager.h" | ||||
| #include "font.h" | ||||
| #include "bitmapfont.h" | ||||
| 
 | ||||
| CachedText::CachedText() | ||||
| { | ||||
|  |  | |||
|  | @ -34,13 +34,13 @@ public: | |||
|     void draw(const Rect& rect); | ||||
| 
 | ||||
|     void wrapText(int maxWidth); | ||||
|     void setFont(const FontPtr& font) { m_font = font; update(); } | ||||
|     void setFont(const BitmapFontPtr& font) { m_font = font; update(); } | ||||
|     void setText(const std::string& text) { m_text = text; update(); } | ||||
|     void setAlign(Fw::AlignmentFlag align) { m_align = align; update(); } | ||||
| 
 | ||||
|     Size getTextSize() { return m_textSize; } | ||||
|     std::string getText() { return m_text; } | ||||
|     FontPtr getFont() { return m_font; } | ||||
|     BitmapFontPtr getFont() { return m_font; } | ||||
|     Fw::AlignmentFlag getAlign() { return m_align; } | ||||
| 
 | ||||
| private: | ||||
|  | @ -51,7 +51,7 @@ private: | |||
|     Boolean<true> m_textMustRecache; | ||||
|     CoordsBuffer m_textCoordsBuffer; | ||||
|     Rect m_textCachedScreenCoords; | ||||
|     FontPtr m_font; | ||||
|     BitmapFontPtr m_font; | ||||
|     Fw::AlignmentFlag m_align; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ | |||
| class Texture; | ||||
| class Image; | ||||
| class AnimatedTexture; | ||||
| class Font; | ||||
| class BitmapFont; | ||||
| class CachedText; | ||||
| class FrameBuffer; | ||||
| class Shader; | ||||
|  | @ -46,7 +46,7 @@ typedef std::weak_ptr<ParticleSystem> ParticleSystemWeakPtr; | |||
| typedef std::shared_ptr<Image> ImagePtr; | ||||
| typedef std::shared_ptr<Texture> TexturePtr; | ||||
| typedef std::shared_ptr<AnimatedTexture> AnimatedTexturePtr; | ||||
| typedef std::shared_ptr<Font> FontPtr; | ||||
| typedef std::shared_ptr<BitmapFont> BitmapFontPtr; | ||||
| typedef std::shared_ptr<CachedText> CachedTextPtr; | ||||
| typedef std::shared_ptr<FrameBuffer> FrameBufferPtr; | ||||
| typedef std::shared_ptr<Shader> ShaderPtr; | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ FontManager g_fonts; | |||
| 
 | ||||
| FontManager::FontManager() | ||||
| { | ||||
|     m_defaultFont = FontPtr(new Font("emptyfont")); | ||||
|     m_defaultFont = BitmapFontPtr(new BitmapFont("emptyfont")); | ||||
| } | ||||
| 
 | ||||
| void FontManager::releaseFonts() | ||||
|  | @ -57,7 +57,7 @@ bool FontManager::importFont(std::string fontFile) | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         FontPtr font(new Font(name)); | ||||
|         BitmapFontPtr font(new BitmapFont(name)); | ||||
|         font->load(fontNode); | ||||
|         m_fonts.push_back(font); | ||||
| 
 | ||||
|  | @ -74,17 +74,17 @@ bool FontManager::importFont(std::string fontFile) | |||
| 
 | ||||
| bool FontManager::fontExists(const std::string& fontName) | ||||
| { | ||||
|     for(const FontPtr& font : m_fonts) { | ||||
|     for(const BitmapFontPtr& font : m_fonts) { | ||||
|         if(font->getName() == fontName) | ||||
|             return true; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| FontPtr FontManager::getFont(const std::string& fontName) | ||||
| BitmapFontPtr FontManager::getFont(const std::string& fontName) | ||||
| { | ||||
|     // find font by name
 | ||||
|     for(const FontPtr& font : m_fonts) { | ||||
|     for(const BitmapFontPtr& font : m_fonts) { | ||||
|         if(font->getName() == fontName) | ||||
|             return font; | ||||
|     } | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ | |||
| #ifndef FONTMANAGER_H | ||||
| #define FONTMANAGER_H | ||||
| 
 | ||||
| #include "font.h" | ||||
| #include "bitmapfont.h" | ||||
| 
 | ||||
| class FontManager | ||||
| { | ||||
|  | @ -37,14 +37,14 @@ public: | |||
|     bool importFont(std::string fontFile); | ||||
| 
 | ||||
|     bool fontExists(const std::string& fontName); | ||||
|     FontPtr getFont(const std::string& fontName); | ||||
|     FontPtr getDefaultFont() { return m_defaultFont; } | ||||
|     BitmapFontPtr getFont(const std::string& fontName); | ||||
|     BitmapFontPtr getDefaultFont() { return m_defaultFont; } | ||||
| 
 | ||||
|     void setDefaultFont(const std::string& fontName) { m_defaultFont = getFont(fontName); } | ||||
| 
 | ||||
| private: | ||||
|     std::vector<FontPtr> m_fonts; | ||||
|     FontPtr m_defaultFont; | ||||
|     std::vector<BitmapFontPtr> m_fonts; | ||||
|     BitmapFontPtr m_defaultFont; | ||||
| }; | ||||
| 
 | ||||
| extern FontManager g_fonts; | ||||
|  |  | |||
|  | @ -20,6 +20,9 @@ | |||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef PAINTEROGL2_SHADERSOURCES_H | ||||
| #define PAINTEROGL2_SHADERSOURCES_H | ||||
| 
 | ||||
| static const std::string glslMainVertexShader = "\n\
 | ||||
|     highp vec4 calculatePosition();\n\ | ||||
|     void main() {\n\ | ||||
|  | @ -66,3 +69,5 @@ static const std::string glslSolidColorFragmentShader = "\n\ | |||
|     lowp vec4 calculatePixel() {\n\ | ||||
|         return u_Color;\n\ | ||||
|     }\n"; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -78,6 +78,7 @@ bool Shader::compileSourceFile(const std::string& sourceFile) | |||
|     } catch(stdext::exception& e) { | ||||
|         g_logger.error(stdext::format("unable to load shader source form file: %s", sourceFile)); | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| std::string Shader::log() | ||||
|  |  | |||
|  | @ -95,7 +95,7 @@ namespace luabinder | |||
|     template<typename Ret, typename F, typename Tuple> | ||||
|     LuaCppFunction bind_fun_specializer(const F& f) { | ||||
|         enum { N = std::tuple_size<Tuple>::value }; | ||||
|         return [=](LuaInterface* lua) { | ||||
|         return [=](LuaInterface* lua) -> int { | ||||
|             if(lua->stackSize() != N) | ||||
|                 throw LuaBadNumberOfArgumentsException(N, lua->stackSize()); | ||||
|             Tuple tuple; | ||||
|  | @ -248,7 +248,7 @@ namespace luabinder | |||
|     template<typename C> | ||||
|     LuaCppFunction bind_mem_fun(int (C::*f)(LuaInterface*)) { | ||||
|         auto mf = std::mem_fn(f); | ||||
|         return [=](LuaInterface* lua) { | ||||
|         return [=](LuaInterface* lua) -> int { | ||||
|             auto obj = lua->castValue<std::shared_ptr<C>>(1); | ||||
|             lua->remove(1); | ||||
|             return mf(obj, lua); | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ void LuaInterface::init() | |||
|     bindClassMemberFunction<LuaObject>("getUseCount", &LuaObject::getUseCount); | ||||
|     bindClassMemberFunction<LuaObject>("getClassName", &LuaObject::getClassName); | ||||
| 
 | ||||
|     registerClassMemberFunction<LuaObject>("getFieldsTable", (LuaCppFunction) ([](LuaInterface* lua) { | ||||
|     registerClassMemberFunction<LuaObject>("getFieldsTable", (LuaCppFunction) ([](LuaInterface* lua) -> int { | ||||
|         LuaObjectPtr obj = g_lua.popObject(); | ||||
|         obj->luaGetFieldsTable(); | ||||
|         return 1; | ||||
|  |  | |||
|  | @ -23,6 +23,11 @@ | |||
| #ifndef STDEXT_CAST_H | ||||
| #define STDEXT_CAST_H | ||||
| 
 | ||||
| namespace stdext { | ||||
| template<typename R, typename T> R safe_cast(const T& t); | ||||
| template<typename R, typename T> R unsafe_cast(const T& t, R def = R()); | ||||
| } | ||||
| 
 | ||||
| #include "string.h" | ||||
| #include "exception.h" | ||||
| #include "demangle.h" | ||||
|  | @ -107,7 +112,7 @@ R safe_cast(const T& t) { | |||
| 
 | ||||
| // cast a type to another type, cast errors are ignored
 | ||||
| template<typename R, typename T> | ||||
| R unsafe_cast(const T& t, R def = R()) { | ||||
| R unsafe_cast(const T& t, R def) { | ||||
|     try { | ||||
|         return safe_cast<R,T>(t); | ||||
|     } catch(cast_exception& e) { | ||||
|  |  | |||
|  | @ -23,12 +23,19 @@ | |||
| #ifndef STDEXT_COMPILER_H | ||||
| #define STDEXT_COMPILER_H | ||||
| 
 | ||||
| #if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | ||||
| #error "sorry, you need gcc 4.6 or greater to compile" | ||||
| #ifdef __clang__ | ||||
|     // clang is supported
 | ||||
|     #undef _GLIBCXX_USE_FLOAT128 | ||||
| #elif defined(__GNUC__) | ||||
|     #if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | ||||
|     #error "Sorry, you need gcc 4.6 or greater to compile." | ||||
|     #endif | ||||
| #else | ||||
|     #error "Compiler not supported." | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(__GXX_EXPERIMENTAL_CXX0X__) | ||||
| #error "sorry, you must enable C++0x to compile" | ||||
| #error "Sorry, you must enable C++0x to compile." | ||||
| #endif | ||||
| 
 | ||||
| // hack to enable std::thread on mingw32 4.6
 | ||||
|  |  | |||
|  | @ -37,10 +37,6 @@ | |||
| 
 | ||||
| namespace stdext { | ||||
| 
 | ||||
| // casts declaration, definition will be included at the end of the file
 | ||||
| template<typename R, typename T> R safe_cast(const T& t); | ||||
| template<typename R, typename T> R unsafe_cast(const T& t, R def = R()); | ||||
| 
 | ||||
| /// Convert any type to std::string
 | ||||
| template<typename T> | ||||
| std::string to_string(const T& t) { return unsafe_cast<std::string, T>(t); } | ||||
|  |  | |||
|  | @ -375,3 +375,5 @@ int luaopen_bit32 (lua_State *L) { | |||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| #undef trim | ||||
| 
 | ||||
|  |  | |||
|  | @ -335,16 +335,15 @@ void UIManager::importStyleFromOTML(const OTMLNodePtr& styleNode) | |||
|         styleNode->writeAt("__unique", true); | ||||
|     } | ||||
| 
 | ||||
|     // TODO: styles must be searched by widget scopes, in that way this warning could be fixed
 | ||||
|     // this warning is disabled because many ppl was complening about it
 | ||||
|     /*
 | ||||
|     auto it = m_styles.find(name); | ||||
|     if(it != m_styles.end()) | ||||
|         g_logger.warning("style '%s' is being redefined", name); | ||||
|     */ | ||||
|     // Warn about redefined styles
 | ||||
|     if(!g_app->isRunning() && !unique) { | ||||
|         auto it = m_styles.find(name); | ||||
|         if(it != m_styles.end()) | ||||
|             g_logger.warning(stdext::format("style '%s' is being redefined", name)); | ||||
|     } | ||||
| 
 | ||||
|     OTMLNodePtr oldStyle = m_styles[name]; | ||||
|     if(!oldStyle || oldStyle->valueAt("__unique", false) || unique) { | ||||
|     if(!oldStyle || !oldStyle->valueAt("__unique", false) || unique) { | ||||
|         OTMLNodePtr originalStyle = getStyle(base); | ||||
|         if(!originalStyle) | ||||
|             stdext::throw_exception(stdext::format("base style '%s', is not defined", base)); | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ | |||
|  */ | ||||
| 
 | ||||
| #include "uitextedit.h" | ||||
| #include <framework/graphics/font.h> | ||||
| #include <framework/graphics/bitmapfont.h> | ||||
| #include <framework/graphics/graphics.h> | ||||
| #include <framework/platform/platformwindow.h> | ||||
| #include <framework/core/clock.h> | ||||
|  |  | |||
|  | @ -1208,7 +1208,7 @@ void UIWidget::updateState(Fw::WidgetState state) | |||
|                     newStatus = false; | ||||
|                     break; | ||||
|                 } | ||||
|             } while(widget = parent); | ||||
|             } while((widget = parent)); | ||||
| 
 | ||||
|             updateChildren = newStatus != oldStatus; | ||||
|             break; | ||||
|  | @ -1237,7 +1237,7 @@ void UIWidget::updateState(Fw::WidgetState state) | |||
|                     enabled = false; | ||||
|                     break; | ||||
|                 } | ||||
|             } while(widget = widget->getParent()); | ||||
|             } while((widget = widget->getParent())); | ||||
|             newStatus = !enabled; | ||||
|             updateChildren = newStatus != oldStatus; | ||||
|             break; | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ | |||
| #include <framework/luascript/luaobject.h> | ||||
| #include <framework/graphics/declarations.h> | ||||
| #include <framework/otml/otmlnode.h> | ||||
| #include <framework/graphics/font.h> | ||||
| #include <framework/graphics/bitmapfont.h> | ||||
| #include <framework/graphics/coordsbuffer.h> | ||||
| #include <framework/core/timer.h> | ||||
| 
 | ||||
|  | @ -465,7 +465,7 @@ protected: | |||
|     Point m_textOffset; | ||||
|     Boolean<false> m_textWrap; | ||||
|     Boolean<false> m_textAutoResize; | ||||
|     FontPtr m_font; | ||||
|     BitmapFontPtr m_font; | ||||
| 
 | ||||
| public: | ||||
|     void resizeToText() { setSize(getTextSize()); } | ||||
|  |  | |||
|  | @ -214,7 +214,7 @@ public: | |||
| 
 | ||||
| struct PositionHasher : std::unary_function<Position, std::size_t> { | ||||
|     std::size_t operator()(const Position& pos) const { | ||||
|         return ((((pos.x * 65536) + pos.y) * 15) + pos.z) % 1000000; | ||||
|         return ((((pos.x * 32768) + pos.y) * 16) + pos.z) % 1000000; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eduardo Bart
						Eduardo Bart