Initial commit
This commit is contained in:
		
							
								
								
									
										137
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,137 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					Language: Cpp
 | 
				
			||||||
 | 
					# BasedOnStyle:  LLVM
 | 
				
			||||||
 | 
					AccessModifierOffset: -2
 | 
				
			||||||
 | 
					AlignAfterOpenBracket: Align
 | 
				
			||||||
 | 
					AlignConsecutiveMacros: false
 | 
				
			||||||
 | 
					AlignConsecutiveAssignments: false
 | 
				
			||||||
 | 
					AlignConsecutiveDeclarations: false
 | 
				
			||||||
 | 
					AlignEscapedNewlines: Right
 | 
				
			||||||
 | 
					AlignOperands: true
 | 
				
			||||||
 | 
					AlignTrailingComments: true
 | 
				
			||||||
 | 
					AllowAllArgumentsOnNextLine: true
 | 
				
			||||||
 | 
					AllowAllConstructorInitializersOnNextLine: true
 | 
				
			||||||
 | 
					AllowAllParametersOfDeclarationOnNextLine: true
 | 
				
			||||||
 | 
					AllowShortBlocksOnASingleLine: Never
 | 
				
			||||||
 | 
					AllowShortCaseLabelsOnASingleLine: false
 | 
				
			||||||
 | 
					AllowShortFunctionsOnASingleLine: All
 | 
				
			||||||
 | 
					AllowShortLambdasOnASingleLine: All
 | 
				
			||||||
 | 
					AllowShortIfStatementsOnASingleLine: Never
 | 
				
			||||||
 | 
					AllowShortLoopsOnASingleLine: false
 | 
				
			||||||
 | 
					AlwaysBreakAfterDefinitionReturnType: None
 | 
				
			||||||
 | 
					AlwaysBreakAfterReturnType: None
 | 
				
			||||||
 | 
					AlwaysBreakBeforeMultilineStrings: false
 | 
				
			||||||
 | 
					AlwaysBreakTemplateDeclarations: MultiLine
 | 
				
			||||||
 | 
					BinPackArguments: true
 | 
				
			||||||
 | 
					BinPackParameters: true
 | 
				
			||||||
 | 
					BraceWrapping:
 | 
				
			||||||
 | 
					  AfterCaseLabel: false
 | 
				
			||||||
 | 
					  AfterClass: false
 | 
				
			||||||
 | 
					  AfterControlStatement: false
 | 
				
			||||||
 | 
					  AfterEnum: false
 | 
				
			||||||
 | 
					  AfterFunction: false
 | 
				
			||||||
 | 
					  AfterNamespace: false
 | 
				
			||||||
 | 
					  AfterObjCDeclaration: false
 | 
				
			||||||
 | 
					  AfterStruct: false
 | 
				
			||||||
 | 
					  AfterUnion: false
 | 
				
			||||||
 | 
					  AfterExternBlock: false
 | 
				
			||||||
 | 
					  BeforeCatch: false
 | 
				
			||||||
 | 
					  BeforeElse: false
 | 
				
			||||||
 | 
					  IndentBraces: false
 | 
				
			||||||
 | 
					  SplitEmptyFunction: true
 | 
				
			||||||
 | 
					  SplitEmptyRecord: true
 | 
				
			||||||
 | 
					  SplitEmptyNamespace: true
 | 
				
			||||||
 | 
					BreakBeforeBinaryOperators: None
 | 
				
			||||||
 | 
					BreakBeforeBraces: Attach
 | 
				
			||||||
 | 
					BreakBeforeInheritanceComma: false
 | 
				
			||||||
 | 
					BreakInheritanceList: BeforeColon
 | 
				
			||||||
 | 
					BreakBeforeTernaryOperators: true
 | 
				
			||||||
 | 
					BreakConstructorInitializersBeforeComma: false
 | 
				
			||||||
 | 
					BreakConstructorInitializers: BeforeColon
 | 
				
			||||||
 | 
					BreakAfterJavaFieldAnnotations: false
 | 
				
			||||||
 | 
					BreakStringLiterals: true
 | 
				
			||||||
 | 
					ColumnLimit: 80
 | 
				
			||||||
 | 
					CommentPragmas: "^ IWYU pragma:"
 | 
				
			||||||
 | 
					CompactNamespaces: false
 | 
				
			||||||
 | 
					ConstructorInitializerAllOnOneLineOrOnePerLine: false
 | 
				
			||||||
 | 
					ConstructorInitializerIndentWidth: 4
 | 
				
			||||||
 | 
					ContinuationIndentWidth: 4
 | 
				
			||||||
 | 
					Cpp11BracedListStyle: true
 | 
				
			||||||
 | 
					DeriveLineEnding: true
 | 
				
			||||||
 | 
					DerivePointerAlignment: false
 | 
				
			||||||
 | 
					DisableFormat: false
 | 
				
			||||||
 | 
					ExperimentalAutoDetectBinPacking: false
 | 
				
			||||||
 | 
					FixNamespaceComments: true
 | 
				
			||||||
 | 
					ForEachMacros:
 | 
				
			||||||
 | 
					  - foreach
 | 
				
			||||||
 | 
					  - Q_FOREACH
 | 
				
			||||||
 | 
					  - BOOST_FOREACH
 | 
				
			||||||
 | 
					IncludeBlocks: Regroup
 | 
				
			||||||
 | 
					IncludeCategories:
 | 
				
			||||||
 | 
					  - Regex: '^[<"](fmt|SDL2)/'
 | 
				
			||||||
 | 
					    Priority: 3
 | 
				
			||||||
 | 
					    SortPriority: 0
 | 
				
			||||||
 | 
					  - Regex: "^<"
 | 
				
			||||||
 | 
					    Priority: 4
 | 
				
			||||||
 | 
					    SortPriority: 0
 | 
				
			||||||
 | 
					  - Regex: ".*"
 | 
				
			||||||
 | 
					    Priority: 1
 | 
				
			||||||
 | 
					    SortPriority: 0
 | 
				
			||||||
 | 
					IncludeIsMainRegex: "(Test)?$"
 | 
				
			||||||
 | 
					IncludeIsMainSourceRegex: ""
 | 
				
			||||||
 | 
					IndentCaseLabels: false
 | 
				
			||||||
 | 
					IndentGotoLabels: true
 | 
				
			||||||
 | 
					IndentPPDirectives: None
 | 
				
			||||||
 | 
					IndentWidth: 2
 | 
				
			||||||
 | 
					IndentWrappedFunctionNames: false
 | 
				
			||||||
 | 
					JavaScriptQuotes: Leave
 | 
				
			||||||
 | 
					JavaScriptWrapImports: true
 | 
				
			||||||
 | 
					KeepEmptyLinesAtTheStartOfBlocks: true
 | 
				
			||||||
 | 
					MacroBlockBegin: ""
 | 
				
			||||||
 | 
					MacroBlockEnd: ""
 | 
				
			||||||
 | 
					MaxEmptyLinesToKeep: 1
 | 
				
			||||||
 | 
					NamespaceIndentation: None
 | 
				
			||||||
 | 
					ObjCBinPackProtocolList: Auto
 | 
				
			||||||
 | 
					ObjCBlockIndentWidth: 2
 | 
				
			||||||
 | 
					ObjCSpaceAfterProperty: false
 | 
				
			||||||
 | 
					ObjCSpaceBeforeProtocolList: true
 | 
				
			||||||
 | 
					PenaltyBreakAssignment: 2
 | 
				
			||||||
 | 
					PenaltyBreakBeforeFirstCallParameter: 19
 | 
				
			||||||
 | 
					PenaltyBreakComment: 300
 | 
				
			||||||
 | 
					PenaltyBreakFirstLessLess: 120
 | 
				
			||||||
 | 
					PenaltyBreakString: 1000
 | 
				
			||||||
 | 
					PenaltyBreakTemplateDeclaration: 10
 | 
				
			||||||
 | 
					PenaltyExcessCharacter: 1000000
 | 
				
			||||||
 | 
					PenaltyReturnTypeOnItsOwnLine: 60
 | 
				
			||||||
 | 
					PointerAlignment: Left
 | 
				
			||||||
 | 
					ReflowComments: true
 | 
				
			||||||
 | 
					SortIncludes: true
 | 
				
			||||||
 | 
					SortUsingDeclarations: true
 | 
				
			||||||
 | 
					SpaceAfterCStyleCast: false
 | 
				
			||||||
 | 
					SpaceAfterLogicalNot: false
 | 
				
			||||||
 | 
					SpaceAfterTemplateKeyword: true
 | 
				
			||||||
 | 
					SpaceBeforeAssignmentOperators: true
 | 
				
			||||||
 | 
					SpaceBeforeCpp11BracedList: false
 | 
				
			||||||
 | 
					SpaceBeforeCtorInitializerColon: true
 | 
				
			||||||
 | 
					SpaceBeforeInheritanceColon: true
 | 
				
			||||||
 | 
					SpaceBeforeParens: ControlStatements
 | 
				
			||||||
 | 
					SpaceBeforeRangeBasedForLoopColon: true
 | 
				
			||||||
 | 
					SpaceInEmptyBlock: false
 | 
				
			||||||
 | 
					SpaceInEmptyParentheses: false
 | 
				
			||||||
 | 
					SpacesBeforeTrailingComments: 1
 | 
				
			||||||
 | 
					SpacesInAngles: false
 | 
				
			||||||
 | 
					SpacesInConditionalStatement: false
 | 
				
			||||||
 | 
					SpacesInContainerLiterals: true
 | 
				
			||||||
 | 
					SpacesInCStyleCastParentheses: false
 | 
				
			||||||
 | 
					SpacesInParentheses: false
 | 
				
			||||||
 | 
					SpacesInSquareBrackets: false
 | 
				
			||||||
 | 
					SpaceBeforeSquareBrackets: false
 | 
				
			||||||
 | 
					Standard: Latest
 | 
				
			||||||
 | 
					StatementMacros:
 | 
				
			||||||
 | 
					  - Q_UNUSED
 | 
				
			||||||
 | 
					  - QT_REQUIRE_VERSION
 | 
				
			||||||
 | 
					TabWidth: 8
 | 
				
			||||||
 | 
					UseCRLF: false
 | 
				
			||||||
 | 
					UseTab: Never
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					build/
 | 
				
			||||||
 | 
					.vscode/
 | 
				
			||||||
							
								
								
									
										60
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					cmake_minimum_required(VERSION 3.10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					project("FT22 Steering Wheel Display")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(CMAKE_CXX_STANDARD 17)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# DEPENDENCIES {{{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					find_package(SDL2 REQUIRED)
 | 
				
			||||||
 | 
					find_package(SDL2TTF REQUIRED)
 | 
				
			||||||
 | 
					find_package(SDL2IMAGE REQUIRED)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include(FetchContent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# fmtlib
 | 
				
			||||||
 | 
					set(stw_display_orig_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
 | 
				
			||||||
 | 
					set(BUILD_SHARED_LIBS ON)
 | 
				
			||||||
 | 
					FetchContent_Declare(
 | 
				
			||||||
 | 
					    fmt
 | 
				
			||||||
 | 
					    GIT_REPOSITORY https://github.com/fmtlib/fmt.git
 | 
				
			||||||
 | 
					    GIT_TAG 8.1.1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					if (NOT fmt_POPULATED)
 | 
				
			||||||
 | 
					    FetchContent_MakeAvailable(fmt)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					if (NOT DEFINED fmt_INCLUDE_DIR)
 | 
				
			||||||
 | 
					    set(fmt_INCLUDE_DIR ${fmt_SOURCE_DIR}/${FMT_INC_DIR})
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					set(BUILD_SHARED_LIBS ${lhotse_orig_BUILD_SHARED_LIBS})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# }}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_compile_options(-Wall -Wextra -Wimplicit-fallthrough)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_executable(
 | 
				
			||||||
 | 
					    stw-display
 | 
				
			||||||
 | 
					    src/main.cpp
 | 
				
			||||||
 | 
					    src/App.cpp
 | 
				
			||||||
 | 
					    src/AMI.cpp
 | 
				
			||||||
 | 
					    src/widgets.cpp
 | 
				
			||||||
 | 
					    src/util.cpp
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					target_include_directories(
 | 
				
			||||||
 | 
					    stw-display PUBLIC
 | 
				
			||||||
 | 
					    "include"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					target_include_directories(
 | 
				
			||||||
 | 
					    stw-display PRIVATE
 | 
				
			||||||
 | 
					    ${SDL2_INCLUDE_DIRS}
 | 
				
			||||||
 | 
					    ${fmt_INCLUDE_DIR}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					target_link_libraries(
 | 
				
			||||||
 | 
					    stw-display
 | 
				
			||||||
 | 
					    ${SDL2_LIBRARIES}
 | 
				
			||||||
 | 
					    ${SDL2TTF_LIBRARY}
 | 
				
			||||||
 | 
					    ${SDL2IMAGE_LIBRARY}
 | 
				
			||||||
 | 
					    fmt)
 | 
				
			||||||
 | 
					add_dependencies(stw-display fmt)
 | 
				
			||||||
							
								
								
									
										163
									
								
								cmake/FindSDL2IMAGE.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								cmake/FindSDL2IMAGE.cmake
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,163 @@
 | 
				
			|||||||
 | 
					# Locate SDL2 library
 | 
				
			||||||
 | 
					# This module defines
 | 
				
			||||||
 | 
					# SDL2_LIBRARY, the name of the library to link against
 | 
				
			||||||
 | 
					# SDL2_FOUND, if false, do not try to link to SDL2
 | 
				
			||||||
 | 
					# SDL2_INCLUDE_DIR, where to find SDL.h
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This module responds to the the flag:
 | 
				
			||||||
 | 
					# SDL2_BUILDING_LIBRARY
 | 
				
			||||||
 | 
					# If this is defined, then no SDL2main will be linked in because
 | 
				
			||||||
 | 
					# only applications need main().
 | 
				
			||||||
 | 
					# Otherwise, it is assumed you are building an application and this
 | 
				
			||||||
 | 
					# module will attempt to locate and set the the proper link flags
 | 
				
			||||||
 | 
					# as part of the returned SDL2_LIBRARY variable.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Don't forget to include SDLmain.h and SDLmain.m your project for the
 | 
				
			||||||
 | 
					# OS X framework based version. (Other versions link to -lSDL2main which
 | 
				
			||||||
 | 
					# this module will try to find on your behalf.) Also for OS X, this
 | 
				
			||||||
 | 
					# module will automatically add the -framework Cocoa on your behalf.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
 | 
				
			||||||
 | 
					# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library
 | 
				
			||||||
 | 
					# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
 | 
				
			||||||
 | 
					# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
 | 
				
			||||||
 | 
					# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
 | 
				
			||||||
 | 
					# as appropriate. These values are used to generate the final SDL2_LIBRARY
 | 
				
			||||||
 | 
					# variable, but when these values are unset, SDL2_LIBRARY does not get created.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# $SDL2DIR is an environment variable that would
 | 
				
			||||||
 | 
					# correspond to the ./configure --prefix=$SDL2DIR
 | 
				
			||||||
 | 
					# used in building SDL2.
 | 
				
			||||||
 | 
					# l.e.galup  9-20-02
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Modified by Eric Wing.
 | 
				
			||||||
 | 
					# Added code to assist with automated building by using environmental variables
 | 
				
			||||||
 | 
					# and providing a more controlled/consistent search behavior.
 | 
				
			||||||
 | 
					# Added new modifications to recognize OS X frameworks and
 | 
				
			||||||
 | 
					# additional Unix paths (FreeBSD, etc).
 | 
				
			||||||
 | 
					# Also corrected the header search path to follow "proper" SDL guidelines.
 | 
				
			||||||
 | 
					# Added a search for SDL2main which is needed by some platforms.
 | 
				
			||||||
 | 
					# Added a search for threads which is needed by some platforms.
 | 
				
			||||||
 | 
					# Added needed compile switches for MinGW.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# On OSX, this will prefer the Framework version (if found) over others.
 | 
				
			||||||
 | 
					# People will have to manually change the cache values of
 | 
				
			||||||
 | 
					# SDL2_LIBRARY to override this selection or set the CMake environment
 | 
				
			||||||
 | 
					# CMAKE_INCLUDE_PATH to modify the search paths.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Note that the header path has changed from SDL2/SDL.h to just SDL.h
 | 
				
			||||||
 | 
					# This needed to change because "proper" SDL convention
 | 
				
			||||||
 | 
					# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
 | 
				
			||||||
 | 
					# reasons because not all systems place things in SDL2/ (see FreeBSD).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#=============================================================================
 | 
				
			||||||
 | 
					# Copyright 2003-2009 Kitware, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Distributed under the OSI-approved BSD License (the "License");
 | 
				
			||||||
 | 
					# see accompanying file Copyright.txt for details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This software is distributed WITHOUT ANY WARRANTY; without even the
 | 
				
			||||||
 | 
					# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					# See the License for more information.
 | 
				
			||||||
 | 
					#=============================================================================
 | 
				
			||||||
 | 
					# (To distribute this file outside of CMake, substitute the full
 | 
				
			||||||
 | 
					#  License text for the above reference.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SET(SDL2IMAGE_SEARCH_PATHS
 | 
				
			||||||
 | 
						~/Library/Frameworks
 | 
				
			||||||
 | 
						/Library/Frameworks
 | 
				
			||||||
 | 
						/usr/local
 | 
				
			||||||
 | 
						/usr
 | 
				
			||||||
 | 
						/sw # Fink
 | 
				
			||||||
 | 
						/opt/local # DarwinPorts
 | 
				
			||||||
 | 
						/opt/csw # Blastwave
 | 
				
			||||||
 | 
						/opt
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FIND_PATH(SDL2IMAGE_INCLUDE_DIR SDL_image.h
 | 
				
			||||||
 | 
						HINTS
 | 
				
			||||||
 | 
						$ENV{SDL2IMAGEDIR}
 | 
				
			||||||
 | 
						PATH_SUFFIXES include/SDL2 include
 | 
				
			||||||
 | 
						PATHS ${SDL2IMAGE_SEARCH_PATHS}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FIND_LIBRARY(SDL2IMAGE_LIBRARY_TEMP
 | 
				
			||||||
 | 
						NAMES SDL2_image
 | 
				
			||||||
 | 
						HINTS
 | 
				
			||||||
 | 
						$ENV{SDL2IMAGEDIR}
 | 
				
			||||||
 | 
						PATH_SUFFIXES lib64 lib
 | 
				
			||||||
 | 
						PATHS ${SDL2IMAGE_SEARCH_PATHS}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF(NOT SDL2IMAGE_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
						IF(NOT ${SDL2IMAGE_INCLUDE_DIR} MATCHES ".framework")
 | 
				
			||||||
 | 
							# Non-OS X framework versions expect you to also dynamically link to
 | 
				
			||||||
 | 
							# SDL2IMAGEmain. This is mainly for Windows and OS X. Other (Unix) platforms
 | 
				
			||||||
 | 
							# seem to provide SDL2IMAGEmain for compatibility even though they don't
 | 
				
			||||||
 | 
							# necessarily need it.
 | 
				
			||||||
 | 
							FIND_LIBRARY(SDL2IMAGEMAIN_LIBRARY
 | 
				
			||||||
 | 
								NAMES SDL2_image
 | 
				
			||||||
 | 
								HINTS
 | 
				
			||||||
 | 
								$ENV{SDL2IMAGEDIR}
 | 
				
			||||||
 | 
								PATH_SUFFIXES lib64 lib
 | 
				
			||||||
 | 
								PATHS ${SDL2IMAGE_SEARCH_PATHS}
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
						ENDIF(NOT ${SDL2IMAGE_INCLUDE_DIR} MATCHES ".framework")
 | 
				
			||||||
 | 
					ENDIF(NOT SDL2IMAGE_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SDL2IMAGE may require threads on your system.
 | 
				
			||||||
 | 
					# The Apple build may not need an explicit flag because one of the
 | 
				
			||||||
 | 
					# frameworks may already provide it.
 | 
				
			||||||
 | 
					# But for non-OSX systems, I will use the CMake Threads package.
 | 
				
			||||||
 | 
					IF(NOT APPLE)
 | 
				
			||||||
 | 
						FIND_PACKAGE(Threads)
 | 
				
			||||||
 | 
					ENDIF(NOT APPLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# MinGW needs an additional library, mwindows
 | 
				
			||||||
 | 
					# It's total link flags should look like -lmingw32 -lSDL2IMAGEmain -lSDL2IMAGE -lmwindows
 | 
				
			||||||
 | 
					# (Actually on second look, I think it only needs one of the m* libraries.)
 | 
				
			||||||
 | 
					IF(MINGW)
 | 
				
			||||||
 | 
						SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
 | 
				
			||||||
 | 
					ENDIF(MINGW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF(SDL2IMAGE_LIBRARY_TEMP)
 | 
				
			||||||
 | 
						# For SDL2IMAGEmain
 | 
				
			||||||
 | 
						IF(NOT SDL2IMAGE_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
							IF(SDL2IMAGEMAIN_LIBRARY)
 | 
				
			||||||
 | 
								SET(SDL2IMAGE_LIBRARY_TEMP ${SDL2IMAGEMAIN_LIBRARY} ${SDL2IMAGE_LIBRARY_TEMP})
 | 
				
			||||||
 | 
							ENDIF(SDL2IMAGEMAIN_LIBRARY)
 | 
				
			||||||
 | 
						ENDIF(NOT SDL2IMAGE_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# For OS X, SDL2IMAGE uses Cocoa as a backend so it must link to Cocoa.
 | 
				
			||||||
 | 
						# CMake doesn't display the -framework Cocoa string in the UI even
 | 
				
			||||||
 | 
						# though it actually is there if I modify a pre-used variable.
 | 
				
			||||||
 | 
						# I think it has something to do with the CACHE STRING.
 | 
				
			||||||
 | 
						# So I use a temporary variable until the end so I can set the
 | 
				
			||||||
 | 
						# "real" variable in one-shot.
 | 
				
			||||||
 | 
						IF(APPLE)
 | 
				
			||||||
 | 
							SET(SDL2IMAGE_LIBRARY_TEMP ${SDL2IMAGE_LIBRARY_TEMP} "-framework Cocoa")
 | 
				
			||||||
 | 
						ENDIF(APPLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# For threads, as mentioned Apple doesn't need this.
 | 
				
			||||||
 | 
						# In fact, there seems to be a problem if I used the Threads package
 | 
				
			||||||
 | 
						# and try using this line, so I'm just skipping it entirely for OS X.
 | 
				
			||||||
 | 
						IF(NOT APPLE)
 | 
				
			||||||
 | 
							SET(SDL2IMAGE_LIBRARY_TEMP ${SDL2IMAGE_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
 | 
				
			||||||
 | 
						ENDIF(NOT APPLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# For MinGW library
 | 
				
			||||||
 | 
						IF(MINGW)
 | 
				
			||||||
 | 
							SET(SDL2IMAGE_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2IMAGE_LIBRARY_TEMP})
 | 
				
			||||||
 | 
						ENDIF(MINGW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Set the final string here so the GUI reflects the final state.
 | 
				
			||||||
 | 
						SET(SDL2IMAGE_LIBRARY ${SDL2IMAGE_LIBRARY_TEMP} CACHE STRING "Where the SDL2IMAGE Library can be found")
 | 
				
			||||||
 | 
						# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
 | 
				
			||||||
 | 
						SET(SDL2IMAGE_LIBRARY_TEMP "${SDL2IMAGE_LIBRARY_TEMP}" CACHE INTERNAL "")
 | 
				
			||||||
 | 
					ENDIF(SDL2IMAGE_LIBRARY_TEMP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INCLUDE(FindPackageHandleStandardArgs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2IMAGE REQUIRED_VARS SDL2IMAGE_LIBRARY SDL2IMAGE_INCLUDE_DIR)
 | 
				
			||||||
							
								
								
									
										163
									
								
								cmake/FindSDL2TTF.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								cmake/FindSDL2TTF.cmake
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,163 @@
 | 
				
			|||||||
 | 
					# Locate SDL2 library
 | 
				
			||||||
 | 
					# This module defines
 | 
				
			||||||
 | 
					# SDL2_LIBRARY, the name of the library to link against
 | 
				
			||||||
 | 
					# SDL2_FOUND, if false, do not try to link to SDL2
 | 
				
			||||||
 | 
					# SDL2_INCLUDE_DIR, where to find SDL.h
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This module responds to the the flag:
 | 
				
			||||||
 | 
					# SDL2_BUILDING_LIBRARY
 | 
				
			||||||
 | 
					# If this is defined, then no SDL2main will be linked in because
 | 
				
			||||||
 | 
					# only applications need main().
 | 
				
			||||||
 | 
					# Otherwise, it is assumed you are building an application and this
 | 
				
			||||||
 | 
					# module will attempt to locate and set the the proper link flags
 | 
				
			||||||
 | 
					# as part of the returned SDL2_LIBRARY variable.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Don't forget to include SDLmain.h and SDLmain.m your project for the
 | 
				
			||||||
 | 
					# OS X framework based version. (Other versions link to -lSDL2main which
 | 
				
			||||||
 | 
					# this module will try to find on your behalf.) Also for OS X, this
 | 
				
			||||||
 | 
					# module will automatically add the -framework Cocoa on your behalf.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
 | 
				
			||||||
 | 
					# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library
 | 
				
			||||||
 | 
					# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
 | 
				
			||||||
 | 
					# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
 | 
				
			||||||
 | 
					# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
 | 
				
			||||||
 | 
					# as appropriate. These values are used to generate the final SDL2_LIBRARY
 | 
				
			||||||
 | 
					# variable, but when these values are unset, SDL2_LIBRARY does not get created.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# $SDL2DIR is an environment variable that would
 | 
				
			||||||
 | 
					# correspond to the ./configure --prefix=$SDL2DIR
 | 
				
			||||||
 | 
					# used in building SDL2.
 | 
				
			||||||
 | 
					# l.e.galup  9-20-02
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Modified by Eric Wing.
 | 
				
			||||||
 | 
					# Added code to assist with automated building by using environmental variables
 | 
				
			||||||
 | 
					# and providing a more controlled/consistent search behavior.
 | 
				
			||||||
 | 
					# Added new modifications to recognize OS X frameworks and
 | 
				
			||||||
 | 
					# additional Unix paths (FreeBSD, etc).
 | 
				
			||||||
 | 
					# Also corrected the header search path to follow "proper" SDL guidelines.
 | 
				
			||||||
 | 
					# Added a search for SDL2main which is needed by some platforms.
 | 
				
			||||||
 | 
					# Added a search for threads which is needed by some platforms.
 | 
				
			||||||
 | 
					# Added needed compile switches for MinGW.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# On OSX, this will prefer the Framework version (if found) over others.
 | 
				
			||||||
 | 
					# People will have to manually change the cache values of
 | 
				
			||||||
 | 
					# SDL2_LIBRARY to override this selection or set the CMake environment
 | 
				
			||||||
 | 
					# CMAKE_INCLUDE_PATH to modify the search paths.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Note that the header path has changed from SDL2/SDL.h to just SDL.h
 | 
				
			||||||
 | 
					# This needed to change because "proper" SDL convention
 | 
				
			||||||
 | 
					# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
 | 
				
			||||||
 | 
					# reasons because not all systems place things in SDL2/ (see FreeBSD).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#=============================================================================
 | 
				
			||||||
 | 
					# Copyright 2003-2009 Kitware, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Distributed under the OSI-approved BSD License (the "License");
 | 
				
			||||||
 | 
					# see accompanying file Copyright.txt for details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This software is distributed WITHOUT ANY WARRANTY; without even the
 | 
				
			||||||
 | 
					# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					# See the License for more information.
 | 
				
			||||||
 | 
					#=============================================================================
 | 
				
			||||||
 | 
					# (To distribute this file outside of CMake, substitute the full
 | 
				
			||||||
 | 
					#  License text for the above reference.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SET(SDL2TTF_SEARCH_PATHS
 | 
				
			||||||
 | 
						~/Library/Frameworks
 | 
				
			||||||
 | 
						/Library/Frameworks
 | 
				
			||||||
 | 
						/usr/local
 | 
				
			||||||
 | 
						/usr
 | 
				
			||||||
 | 
						/sw # Fink
 | 
				
			||||||
 | 
						/opt/local # DarwinPorts
 | 
				
			||||||
 | 
						/opt/csw # Blastwave
 | 
				
			||||||
 | 
						/opt
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FIND_PATH(SDL2TTF_INCLUDE_DIR SDL_ttf.h
 | 
				
			||||||
 | 
						HINTS
 | 
				
			||||||
 | 
						$ENV{SDL2TTFDIR}
 | 
				
			||||||
 | 
						PATH_SUFFIXES include/SDL2 include
 | 
				
			||||||
 | 
						PATHS ${SDL2TTF_SEARCH_PATHS}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FIND_LIBRARY(SDL2TTF_LIBRARY_TEMP
 | 
				
			||||||
 | 
						NAMES SDL2_ttf
 | 
				
			||||||
 | 
						HINTS
 | 
				
			||||||
 | 
						$ENV{SDL2TTFDIR}
 | 
				
			||||||
 | 
						PATH_SUFFIXES lib64 lib
 | 
				
			||||||
 | 
						PATHS ${SDL2TTF_SEARCH_PATHS}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF(NOT SDL2TTF_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
						IF(NOT ${SDL2TTF_INCLUDE_DIR} MATCHES ".framework")
 | 
				
			||||||
 | 
							# Non-OS X framework versions expect you to also dynamically link to
 | 
				
			||||||
 | 
							# SDL2TTFmain. This is mainly for Windows and OS X. Other (Unix) platforms
 | 
				
			||||||
 | 
							# seem to provide SDL2TTFmain for compatibility even though they don't
 | 
				
			||||||
 | 
							# necessarily need it.
 | 
				
			||||||
 | 
							FIND_LIBRARY(SDL2TTFMAIN_LIBRARY
 | 
				
			||||||
 | 
								NAMES SDL2_ttf
 | 
				
			||||||
 | 
								HINTS
 | 
				
			||||||
 | 
								$ENV{SDL2TTFDIR}
 | 
				
			||||||
 | 
								PATH_SUFFIXES lib64 lib
 | 
				
			||||||
 | 
								PATHS ${SDL2TTF_SEARCH_PATHS}
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
						ENDIF(NOT ${SDL2TTF_INCLUDE_DIR} MATCHES ".framework")
 | 
				
			||||||
 | 
					ENDIF(NOT SDL2TTF_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SDL2TTF may require threads on your system.
 | 
				
			||||||
 | 
					# The Apple build may not need an explicit flag because one of the
 | 
				
			||||||
 | 
					# frameworks may already provide it.
 | 
				
			||||||
 | 
					# But for non-OSX systems, I will use the CMake Threads package.
 | 
				
			||||||
 | 
					IF(NOT APPLE)
 | 
				
			||||||
 | 
						FIND_PACKAGE(Threads)
 | 
				
			||||||
 | 
					ENDIF(NOT APPLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# MinGW needs an additional library, mwindows
 | 
				
			||||||
 | 
					# It's total link flags should look like -lmingw32 -lSDL2TTFmain -lSDL2TTF -lmwindows
 | 
				
			||||||
 | 
					# (Actually on second look, I think it only needs one of the m* libraries.)
 | 
				
			||||||
 | 
					IF(MINGW)
 | 
				
			||||||
 | 
						SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
 | 
				
			||||||
 | 
					ENDIF(MINGW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF(SDL2TTF_LIBRARY_TEMP)
 | 
				
			||||||
 | 
						# For SDL2TTFmain
 | 
				
			||||||
 | 
						IF(NOT SDL2TTF_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
							IF(SDL2TTFMAIN_LIBRARY)
 | 
				
			||||||
 | 
								SET(SDL2TTF_LIBRARY_TEMP ${SDL2TTFMAIN_LIBRARY} ${SDL2TTF_LIBRARY_TEMP})
 | 
				
			||||||
 | 
							ENDIF(SDL2TTFMAIN_LIBRARY)
 | 
				
			||||||
 | 
						ENDIF(NOT SDL2TTF_BUILDING_LIBRARY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# For OS X, SDL2TTF uses Cocoa as a backend so it must link to Cocoa.
 | 
				
			||||||
 | 
						# CMake doesn't display the -framework Cocoa string in the UI even
 | 
				
			||||||
 | 
						# though it actually is there if I modify a pre-used variable.
 | 
				
			||||||
 | 
						# I think it has something to do with the CACHE STRING.
 | 
				
			||||||
 | 
						# So I use a temporary variable until the end so I can set the
 | 
				
			||||||
 | 
						# "real" variable in one-shot.
 | 
				
			||||||
 | 
						IF(APPLE)
 | 
				
			||||||
 | 
							SET(SDL2TTF_LIBRARY_TEMP ${SDL2TTF_LIBRARY_TEMP} "-framework Cocoa")
 | 
				
			||||||
 | 
						ENDIF(APPLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# For threads, as mentioned Apple doesn't need this.
 | 
				
			||||||
 | 
						# In fact, there seems to be a problem if I used the Threads package
 | 
				
			||||||
 | 
						# and try using this line, so I'm just skipping it entirely for OS X.
 | 
				
			||||||
 | 
						IF(NOT APPLE)
 | 
				
			||||||
 | 
							SET(SDL2TTF_LIBRARY_TEMP ${SDL2TTF_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
 | 
				
			||||||
 | 
						ENDIF(NOT APPLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# For MinGW library
 | 
				
			||||||
 | 
						IF(MINGW)
 | 
				
			||||||
 | 
							SET(SDL2TTF_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2TTF_LIBRARY_TEMP})
 | 
				
			||||||
 | 
						ENDIF(MINGW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Set the final string here so the GUI reflects the final state.
 | 
				
			||||||
 | 
						SET(SDL2TTF_LIBRARY ${SDL2TTF_LIBRARY_TEMP} CACHE STRING "Where the SDL2TTF Library can be found")
 | 
				
			||||||
 | 
						# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
 | 
				
			||||||
 | 
						SET(SDL2TTF_LIBRARY_TEMP "${SDL2TTF_LIBRARY_TEMP}" CACHE INTERNAL "")
 | 
				
			||||||
 | 
					ENDIF(SDL2TTF_LIBRARY_TEMP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INCLUDE(FindPackageHandleStandardArgs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2TTF REQUIRED_VARS SDL2TTF_LIBRARY SDL2TTF_INCLUDE_DIR)
 | 
				
			||||||
							
								
								
									
										20
									
								
								include/AMI.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								include/AMI.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "widgets.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <SDL2/SDL.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constexpr const char* FT_LOGO_PATH = "resources/Fasttube_Logo-white.bmp";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AMI {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  AMI(SDL_Renderer* renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void draw();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					  SDL_Renderer* renderer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ImageWidget ft_logo;
 | 
				
			||||||
 | 
					  TextWidget choose;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										45
									
								
								include/App.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								include/App.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "AMI.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <SDL2/SDL.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <memory>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constexpr int SCREEN_WIDTH = 480;
 | 
				
			||||||
 | 
					constexpr int SCREEN_HEIGHT = 320;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum class AppView { AMI, DRIVER, TESTING };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SDLManager {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  SDLManager();
 | 
				
			||||||
 | 
					  ~SDLManager();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class App {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  App();
 | 
				
			||||||
 | 
					  ~App();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int run();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					  void init_sdl();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void handle_events();
 | 
				
			||||||
 | 
					  void render();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // The SDLManager initializes & quits SDL and its subsystems. Thus, it must be
 | 
				
			||||||
 | 
					  // the first member of the class, so that its constructor is called before the
 | 
				
			||||||
 | 
					  // others and its destructor is called after the others.
 | 
				
			||||||
 | 
					  SDLManager sdl_manager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::unique_ptr<AMI> ami;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool running;
 | 
				
			||||||
 | 
					  AppView view;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SDL_Window* window;
 | 
				
			||||||
 | 
					  SDL_Renderer* renderer;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										13
									
								
								include/util.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								include/util.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <SDL2/SDL.h>
 | 
				
			||||||
 | 
					#include <SDL2/SDL_ttf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace util {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SDL_Texture* load_img(SDL_Renderer* renderer, const std::string& path);
 | 
				
			||||||
 | 
					TTF_Font* load_font(const std::string& path, int pt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										57
									
								
								include/widgets.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								include/widgets.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <SDL2/SDL.h>
 | 
				
			||||||
 | 
					#include <SDL2/SDL_ttf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <optional>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Widget {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  Widget(SDL_Renderer* renderer, SDL_Rect dest_rect);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void update_rect(SDL_Rect new_rect);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void draw() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					  SDL_Renderer* renderer;
 | 
				
			||||||
 | 
					  SDL_Rect dest_rect;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TextureWidget : public Widget {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  TextureWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
 | 
				
			||||||
 | 
					                std::optional<SDL_Texture*> texture);
 | 
				
			||||||
 | 
					  ~TextureWidget();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void draw() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void update_texture(SDL_Texture* new_texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					  std::optional<SDL_Texture*> texture;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ImageWidget : public TextureWidget {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  ImageWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
 | 
				
			||||||
 | 
					              const std::string& path);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TextWidget : public TextureWidget {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  TextWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
 | 
				
			||||||
 | 
					             const std::string& font_path,
 | 
				
			||||||
 | 
					             const std::string& initial_text = "");
 | 
				
			||||||
 | 
					  ~TextWidget();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void update_text(const std::string& new_text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					  TTF_Font* font;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::string text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SDL_Texture* generate_text(const std::string& text);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								resources/Avenir-Book.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/Avenir-Book.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/Fasttube_Logo-white.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/Fasttube_Logo-white.bmp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.1 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								resources/Fasttube_Logo-white.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/Fasttube_Logo-white.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										17
									
								
								src/AMI.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/AMI.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					#include "AMI.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AMI::AMI(SDL_Renderer* renderer)
 | 
				
			||||||
 | 
					    : renderer{renderer}, ft_logo{renderer,
 | 
				
			||||||
 | 
					                                  {.x = 182, .y = 0, .w = 116, .h = 40},
 | 
				
			||||||
 | 
					                                  FT_LOGO_PATH},
 | 
				
			||||||
 | 
					      choose{renderer,
 | 
				
			||||||
 | 
					             {.x = 0, .y = 45, .w = 480, .h = 40},
 | 
				
			||||||
 | 
					             "resources/Avenir-Book.ttf",
 | 
				
			||||||
 | 
					             "Choose a Mission:"} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void AMI::draw() {
 | 
				
			||||||
 | 
					  SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
 | 
				
			||||||
 | 
					  SDL_RenderClear(renderer);
 | 
				
			||||||
 | 
					  ft_logo.draw();
 | 
				
			||||||
 | 
					  choose.draw();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										89
									
								
								src/App.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/App.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					#include "App.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "AMI.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <SDL2/SDL_image.h>
 | 
				
			||||||
 | 
					#include <fmt/format.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdexcept>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					App::App() : view{AppView::AMI} { init_sdl(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					App::~App() {
 | 
				
			||||||
 | 
					  // Destroy window
 | 
				
			||||||
 | 
					  SDL_DestroyRenderer(renderer);
 | 
				
			||||||
 | 
					  renderer = nullptr;
 | 
				
			||||||
 | 
					  SDL_DestroyWindow(window);
 | 
				
			||||||
 | 
					  window = nullptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void App::init_sdl() {
 | 
				
			||||||
 | 
					  window = SDL_CreateWindow("FT22 STW Display", SDL_WINDOWPOS_UNDEFINED,
 | 
				
			||||||
 | 
					                            SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH,
 | 
				
			||||||
 | 
					                            SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
 | 
				
			||||||
 | 
					  if (window == nullptr) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Couldn't create window: {}", SDL_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
 | 
				
			||||||
 | 
					  if (renderer == nullptr) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Couldn't create renderer: {}", SDL_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int App::run() {
 | 
				
			||||||
 | 
					  ami = std::make_unique<AMI>(renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  running = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (running) {
 | 
				
			||||||
 | 
					    handle_events();
 | 
				
			||||||
 | 
					    render();
 | 
				
			||||||
 | 
					    SDL_Delay(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void App::handle_events() {
 | 
				
			||||||
 | 
					  SDL_Event e;
 | 
				
			||||||
 | 
					  while (SDL_PollEvent(&e) != 0) {
 | 
				
			||||||
 | 
					    if (e.type == SDL_QUIT) {
 | 
				
			||||||
 | 
					      running = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void App::render() {
 | 
				
			||||||
 | 
					  switch (view) {
 | 
				
			||||||
 | 
					  case AppView::AMI:
 | 
				
			||||||
 | 
					    ami->draw();
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					  default:
 | 
				
			||||||
 | 
					    throw std::runtime_error(fmt::format("Unknown view: {}", (int)view));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  SDL_RenderPresent(renderer);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SDLManager::SDLManager() {
 | 
				
			||||||
 | 
					  if (SDL_Init(SDL_INIT_VIDEO) < 0) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Couldn't initialize SDL: {}", SDL_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (TTF_Init() == -1) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Couldn't initialize SDL_ttf: {}", TTF_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  int img_flags = IMG_INIT_PNG;
 | 
				
			||||||
 | 
					  if (!(IMG_Init(img_flags) & img_flags)) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Couldn't initialitze SDL_image: {}", IMG_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SDLManager::~SDLManager() {
 | 
				
			||||||
 | 
					  IMG_Quit();
 | 
				
			||||||
 | 
					  TTF_Quit();
 | 
				
			||||||
 | 
					  SDL_Quit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					#include "App.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main() {
 | 
				
			||||||
 | 
					  App app;
 | 
				
			||||||
 | 
					  return app.run();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										34
									
								
								src/util.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/util.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					#include "util.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <SDL2/SDL_image.h>
 | 
				
			||||||
 | 
					#include <fmt/format.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdexcept>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace util {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SDL_Texture* load_img(SDL_Renderer* renderer, const std::string& path) {
 | 
				
			||||||
 | 
					  SDL_Surface* loaded = IMG_Load(path.c_str());
 | 
				
			||||||
 | 
					  if (loaded == nullptr) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Unable to load image {}: {}", path, IMG_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, loaded);
 | 
				
			||||||
 | 
					  if (texture == nullptr) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(fmt::format(
 | 
				
			||||||
 | 
					        "Unable to convert image {} to texture: {}", path, IMG_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  SDL_FreeSurface(loaded);
 | 
				
			||||||
 | 
					  return texture;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TTF_Font* load_font(const std::string& path, int pt) {
 | 
				
			||||||
 | 
					  TTF_Font* font = TTF_OpenFont(path.c_str(), pt);
 | 
				
			||||||
 | 
					  if (font == nullptr) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Unable to load font {}: {}", path, TTF_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return font;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace util
 | 
				
			||||||
							
								
								
									
										75
									
								
								src/widgets.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/widgets.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					#include "widgets.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "util.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <SDL2/SDL_image.h>
 | 
				
			||||||
 | 
					#include <fmt/format.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdexcept>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Widget::Widget(SDL_Renderer* renderer, SDL_Rect rect)
 | 
				
			||||||
 | 
					    : renderer{renderer}, dest_rect{rect} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Widget::update_rect(SDL_Rect new_rect) { dest_rect = new_rect; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TextureWidget::TextureWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
 | 
				
			||||||
 | 
					                             std::optional<SDL_Texture*> texture)
 | 
				
			||||||
 | 
					    : Widget{renderer, dest_rect}, texture{texture} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TextureWidget::~TextureWidget() {
 | 
				
			||||||
 | 
					  if (texture) {
 | 
				
			||||||
 | 
					    SDL_DestroyTexture(*texture);
 | 
				
			||||||
 | 
					    texture = nullptr;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TextureWidget::draw() {
 | 
				
			||||||
 | 
					  if (texture) {
 | 
				
			||||||
 | 
					    SDL_RenderCopy(renderer, *texture, NULL, &dest_rect);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TextureWidget::update_texture(SDL_Texture* new_texture) {
 | 
				
			||||||
 | 
					  if (texture) {
 | 
				
			||||||
 | 
					    SDL_DestroyTexture(*texture);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  texture = new_texture;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ImageWidget::ImageWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
 | 
				
			||||||
 | 
					                         const std::string& path)
 | 
				
			||||||
 | 
					    : TextureWidget{renderer, dest_rect, util::load_img(renderer, path)} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TextWidget::TextWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
 | 
				
			||||||
 | 
					                       const std::string& font_path,
 | 
				
			||||||
 | 
					                       const std::string& initial_text)
 | 
				
			||||||
 | 
					    : TextureWidget{renderer, dest_rect, std::nullopt},
 | 
				
			||||||
 | 
					      font{util::load_font(font_path, 28)}, text{initial_text} {
 | 
				
			||||||
 | 
					  if (text != "") {
 | 
				
			||||||
 | 
					    update_texture(generate_text(text));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TextWidget::~TextWidget() { TTF_CloseFont(font); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TextWidget::update_text(const std::string& new_text) {
 | 
				
			||||||
 | 
					  if (text != new_text) {
 | 
				
			||||||
 | 
					    update_texture(generate_text(new_text));
 | 
				
			||||||
 | 
					    text = new_text;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SDL_Texture* TextWidget::generate_text(const std::string& text) {
 | 
				
			||||||
 | 
					  SDL_Surface* surf =
 | 
				
			||||||
 | 
					      TTF_RenderText_Solid(font, text.c_str(), {0xFF, 0xFF, 0XFF, 0xFF});
 | 
				
			||||||
 | 
					  if (surf == nullptr) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					        fmt::format("Unable to render text surface: {}", TTF_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surf);
 | 
				
			||||||
 | 
					  if (texture == nullptr) {
 | 
				
			||||||
 | 
					    throw std::runtime_error(fmt::format(
 | 
				
			||||||
 | 
					        "Unable to create texture from text surface: {}", SDL_GetError()));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return texture;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user